思想:比较相邻两个,逆序就交换,每次排序将最大的‘下沉’或最小的‘上浮’。
function bubbleSort(arr){ const len = arr.length; let temp = 0; for(let i=0;i<len-1;i++){ for(let j=0;j<len-i-1;j++){ if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } return arr; }
时间复杂度:
最好情况:正序。只需要一趟排序,进行n-1次比较,不移动记录。
最坏情况:逆序。只要n-1趟排序,比较次数为n^2/2,移动次数3n^2/2。
所以时间复杂度为O(n^2)。
空间复杂度:
只在两个记录交换位置时需要一个辅助空间做暂存记录,所以空间复杂度为O(1)。
特点:
1、是稳定排序。
2、可用于链式存储结构。
3、移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时,此算法不适合。
附:改进后的冒泡
每次得到两个值,最大和最小值。
function bubbleSort(arr) { var low = 0; var high= arr.length-1; //设置变量的初始值 var tmp,j; while(low<high){ for(j=low;j<high;++j) //正向冒泡,找到最大 if(arr[j]>arr[j+1]){ tmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp; } --high; //high前移一位 for(j=high;j>low;--j) //反向冒泡,找到最小 if(arr[j]<arr[j-1]){ tmp=arr[j];arr[j]=arr[j-1];arr[j-1]=tmp; } ++low; //low后移一位 } return arr; }