上篇博文总结了选择排序,这篇来看冒泡排序,接上篇。
冒泡排序思想:若是正再将一组数据升序排序,
第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后一个元素,则最大的数必然冒泡到最后一个元素。
第二趟:用同样的方法比较前面的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).