上篇博文总结了选择排序,这篇来看冒泡排序,接上篇。

冒泡排序思想:若是正再将一组数据升序排序,

第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后一个元素,则最大的数必然冒泡到最后一个元素。

第二趟:用同样的方法比较前面的n-1个纪录,以此进行比较和交换,第2大的数就会冒到倒数第2个元素。

........

以此类推,直到i=n-1最后一趟比较完为止。

js代码如下:

function bubbleSort(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}

但是上边算法有点小问题,复杂度有点高,试想如果关键字序列为31,12,42,55,68,90,那么第一趟排序结果为12,31,42,55,68,90,显然,序列已经升序有序,就可以直接结束整个排序,而不是继续排序。因此改进算法如下:设置flag标志,用来标志是否进行交换排序,从而跟踪序列是否已经有序

代码算法如下:

function bubbleSort1(arr) {
var flag = true;
for (var i = 0; i < arr.length && flag; i++) {
flag = false;
for (var j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
}
return arr;
}

冒泡排序是最慢的排序算法之一。

时间复杂度分析:最好情况下已经有序,故外层循环只需要进行1次就结束整个排序过程,最小时间复杂度为O(n)。最差的情况外层最多进行n-1次,内层循环进行n-i次,所以时间复杂度为O(n*n)。

稳定性:冒泡排序是一中稳定的排序算法。

空间复杂度:需要一个辅助空间进行交换,故为O(1).