冒泡排序算法的运作如下:
-
比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大(小)的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
每次对数组进行一次交换,只会确定最后的数,所以,下一次从头开始比较,不需要再对最后一个数进行比较了,如果循环往复,直到最后只剩索引为0的数字,将不再需要进行循环比较。
举个例子,有个数组如下:
[9, 7, 8, 33, 45]
第一次比较:
- 9与7比较,交换位置;
- 9再与8比较,交换位置;
- 9与33比较,不需交换;
- 33与45比较,不需交换;
第一次的结果为:
[7, 8, 9, 33, 45]
除了45确定为最大值外,其余项需要再一次的比较,直到最终后四项都确定了,不再需要再次比较。
下面展示了如何用js代码实现冒泡排序:
方法一:
function bubblesort(arr, endindex) { var len = endindex ? endindex : arr.length; if(len == 1) { return arr; } for(var i=0; i< len - 1; i++) { var prev = arr[i], next = arr[i+1]; if(prev > next) { arr[i] = next; arr[i+1] = prev; } } arguments.callee(arr, len-1); }
方法二
function bubblesort2(arr) { var len = arr.length, i = len, j = 0; while(i > 0) { for(j = 0; j< i - 1; j++) { var prev = arr[j], next = arr[j+1]; if(prev > next) { arr[j] = next; arr[j+1] = prev; } } i--; } return arr; }
方法三(使用es6的解构赋值):
export function bubblesort3(arr) { let len = arr.length; let [i, j] = [len, 0]; while(i > 0) { for(j = 0; j< i - 1; j++) { let prev = arr[j], next = arr[j+1]; if(prev > next) { [arr[j], arr[j+1]] = [next, prev]; } } i--; } return arr; }