1. 普通冒泡

思想

假设有n个数,按从小到大排序:

  • 进行n-1次外循环,每次外循环会排好当前处理的数中的最大数,即进行第一次外循环排好所有数中的最大数,进行第二次外循环排好所有数中的次大数....直到第n-1次外循环,排好第n-1大的数,也就是倒数第二小的数,那么剩下的那个就是最小的数
  • 在第i+1次外循环中,只需要处理前n-i-1个数,因为后面的i+1个数已经排好。即此时内循环需要比较前n-i-1个数。
  • 在内循环中,依次比较两个相邻项,如果前面一项比后面一项大,则交换他们。最终,内循环处理完这前n-i-1个数后,会把这n-i-1个数中最大的那个数排到第n-i-1的位置上。

代码

function bubbleSort(arr) {
const length = arr.length;
for (let i = 0; i < length - 1; i++) {
let changeOccur = false; //用于标记某次外循环中,是否方式内循环交换事件
for (let j = 0; j < length - i -1; j++) {
if (arr[j] > arr[j+1]) {
/*
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
*/
//这三行的交换函数用ES6来写:
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
changeOccur = true;
}
} if (!changeOccur) { //如果一次外循环中,没有发生一次内循环交换,那么可以直接结束排序比较
break;
}
}
}

性能分析

  • 时间复杂度:最好O(n),平均、最坏O(n^2)
  • 空间复杂度: O(1), 稳定

2. 鸡尾酒排序

思想

双向的冒泡排序。

代码

function coaktailBubbleSort(arr) {
const length = arr.length;
let low = 0;
let high = length - 1; while(low < high) {
let changeOccur = false;
for (let j = low; j < high; j++) {
if(arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
changeOccur = true;
}
}
if(!changeOccur) {
break;//如果一次交换也没有发生,那直接就可以跳出,结束排序
}
high--;
changeOccur = false;
for (let j = high; j > low; j--) {
if (arr[j] < arr[j-1]) {
[arr[j-1], arr[j]] = [arr[j], arr[j-1]];
changeOccur = true;
}
}
if(!changeOccur) {
break;
}
low++;
}
}

延伸:对比冒泡排序的C语言实现:

1. 普通冒泡

# include<stdio.h>

void bubble(int *list,int len)
{
int i,j,t,flag=0;
for(i=0;i<len-1;i++)
{
flag=0;//设置标记,当某一轮交换没有交换任何数,那下一轮交换也不必进行了
for(j=0;j<len-1-i;j++)
{
if(list[j]>list[j+1])
{
t=list[j];
list[j]=list[j+1];
list[j+1]=t;
flag=1;
}
}
if(flag==0)
{
break;
}
} } void main()
{
int n,list[10];
printf("请输入10个整数:");
for(n=0;n<10;n++)
{
scanf("%d",&list[n]);
}
printf("\n");
bubble(list,10);
for(n=0;n<10;n++)
{
printf("%d\t",list[n]);
}
printf("\n"); }

2. 鸡尾酒冒泡

#include<stdio.h>

void CocktailBubble(int *list,int n)
{
int low=0,high=n-1,j,t,flag;
while(low<high)
{
flag=0;//一次进行两趟for循环,第一个for循环排最大值(次大值),第二个for循环排最小值(次小值),只要其中一趟没有交换任何数字就可以结束排序
for(j=low;j<high;j++)
{
if(list[j]>list[j+1])
{
t=list[j];
list[j]=list[j+1];
list[j+1]=t;
flag=1;
}
}
if(flag==0)
{
break;
}
high--;//上述for循环第一次结束,排完最大值;第二次,排完次大值
flag = 0;
for(j=high;j>low;j--)
{
if(list[j]<list[j-1])
{
t=list[j];
list[j]=list[j-1];
list[j-1]=t;
flag = 1;
}
}
if(flag==0)
{
break;
}
low++;//上述for循环第一次结束,排完最小值;第二次,排完次小值 }
} void main(){
int i,list[10];
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",&list[i]);
}
for(i=0;i<10;i++){
printf("%d ",list[i]);
}
printf("\n");
CocktailBubble(list,10);
for(i=0;i<10;i++){
printf("%d ",list[i]);
}
printf("\n");
}

冒泡排序的JavaScript实现的更多相关文章

  1. 冒泡排序之javascript

    冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...

  2. Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)

    冒泡排序的Javascript实现 首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组, function bubbleSort(arr) { console.time('冒泡 ...

  3. 算法之冒泡排序手写之js写法andjava写法

    对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了? 本系列文章帮助你解决这个问题. 其实排序算法,仔细品读他的名字就见名知意了. 比如冒泡排序就很形象,遍历n次,每次循环相邻元素两 ...

  4. JavaScript算法(冒泡排序、选择排序与插入排序)

    冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...

  5. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  6. JavaScript实现冒泡排序、快速排序、插入排序

    JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51  来源:  作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...

  7. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  8. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  9. javascript的冒泡排序, 快速排序, 选择排序, 插入排序

    冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...

随机推荐

  1. [算法] 将单链表的每K个节点之间逆序

    题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...

  2. Spring AOP(2)

  3. Spring mvc和Servlet

    总结: Servlet:性能最好,处理Http请求的标准. SpringMVC:开发效率高(好多共性的东西都封装好了,是对Servlet的封装,核心的DispatcherServlet最终继承自Htt ...

  4. Android -- junit测试框架,logcat获取log信息

    1. 相关概念 白盒测试: 知道程序源代码. 根据测试的粒度分为不同的类型   方法测试 function test         单元测试 unit test                 集成 ...

  5. Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session

    知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...

  6. Find Min In Rotated Sorted Array,寻找反转序列中最小的元素。

    问题描述:寻找反转序列中最小的元素. 算法分析:和寻找某个数是一个道理,还是利用二分查找,总体上分两种情况.nums[left]<=nums[mid],else.但是,在截取子序列的时候,有可能 ...

  7. 摘录:MINA 框架简介

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mi ...

  8. 如果在applicationContext.xml中没有配置bean的属性,那么也会导致空指针异常

    报错如下: java.lang.NullPointerException cn.itcast.action.VisitAction.toAddPage(VisitAction.java:37) sun ...

  9. yii2定时任务不执行,报错PHP date调用警告:It is not safe to rely on the system's timezone settings

    It is not safe to rely on the system's timezone settings 在写php程序中有时会出现这样的警告:PHP Warning: date(): It ...

  10. go语言的一个简单httpserver

    httpserver.go package main import ( "net/http" "flag" "fmt" "log& ...