冒泡排序就是:
每一轮都是相邻的两个数比较。
第一轮比较:若下标0的数 < 下标1的数,则这两个数交换位置;若下标1的数 < 下标2的数,此时的下标1的数其实是原数组的第0位,则这两个数交换位置;若下标2的数 < 下标3的数,……;直到arr.length - 2 和 arr.length -1比较结束,最终确定最大的一个数并放到了数组的最后一位。
然后进行第二轮比较,这次比较只需要比较第0位到数组的倒数第二位即可,比较方法和第一轮相同,这一轮最终确认数组的倒数第二位即第二大的数值。
然后依次进行第三轮、第四轮……第n-1轮比较知道数组排序完成。
举例说明(以降序排序为例):
数组 arr = [1, 4, 6, 67, 111, 45, 2, 5]
第一轮比较:
- 第0位和第1位比较,1 < 4,互换位置,数组变为 [4, 1, 6, 67, 111, 45, 2, 5];
- 第1位和第2位比较,1 < 6,互换位置,数组变为 [4, 6, 1, 67, 111, 45, 2, 5];
- 第2位和第3位比较,1 < 67,互换位置,数组变为 [4, 6, 67, 1, 111, 45, 2, 5];
- 第3位和第4位比较,1 < 111,互换位置,数组变为 [4, 6, 67, 111, 1, 45, 2, 5];
- 第4位和第5位比较,1 < 45,互换位置,数组变为 [4, 6, 67, 111, 45, 1, 2, 5];
- 第5位和第6位比较,1 < 2,互换位置,数组变为 [4, 6, 67, 111, 45, 2, 1, 5];
- 第6位和第7位比较,1 < 5,互换位置,数组变为 [4, 6, 67, 111, 45, 2, 5,1];
比较n-1(n为数组的长度)次后,确定数组的最小值,并移动到数组的最后一位。
第二轮比较:
- 第0位和第1位比较,4 < 6,互换位置,数组变为 [6, 4, 67, 111, 45, 2, 5, 1];
- 第1位和第2位比较,4 < 67,互换位置,数组变为 [6, 67, 4, 111, 45, 2, 5, 1];
- 第2位和第3位比较,4 < 111,互换位置,数组变为 [6, 67, 111, 4, 45, 2, 5, 1];
- 第3位和第4位比较,4 < 45,互换位置,数组变为 [6, 67, 111, 45, 4, 2, 5, 1];
- 第4位和第5位比较,4 > 2,位置不变,数组仍为 [6, 67, 111, 45, 4, 2, 5, 1];
- 第5位和第6位比较,2 < 5,互换位置,数组变为 [6, 67, 111, 45, 4, 5,2,1];
比较n-1-1(n-2,n为数组的长度)次后,确定数组的第二小的值,并移动到数组的倒数第二位。此轮比较之前已确定数组的最后一位,所以只需要比较前7位即可。
第三轮比较:和前两轮一样,不过只需要比较第0位——第5位的数即可,最终确定数组倒数第三位即第5位的数,最终数组为:[67, 111, 45, 6, 5, 4, 2, 1
第四轮比较:和前面几轮一样,不过只需要比较第0位——第4位的数即可,最终确定数组倒数第4位即第4位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]
第五轮比较:和前面几轮一样,不过只需要比较第0位——第3位的数即可,最终确定数组倒数第5位即第3位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]
第六轮比较:和前面几轮一样,不过只需要比较第0位——第2位的数即可,最终确定数组倒数第6位即第2位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]
第七轮比较:和前面几轮一样,不过只需要比较第0位——第1位的数即可,最终确定数组倒数第7位即第1位的数,最终数组为:[111, 67, 45, 6, 5, 4, 2, 1]
比较n-1轮后,至此,数组排序完成。具体实现方法如下:
/* 方法说明
* @method bubbleSort, 该方法的排序方式为降序
* @param {Array} arr, 需要进行排序的数组
* @return {Array}} 返回排序后的数组
*/
function bubbleSort(arr) {
let len = arr.length - 1;
for (let i = 0; i < len; i ++) {
for (let j = 0; j < len - i; j ++) {
let c; // c 用于交换两个数值的中间变量
if(arr[j] > arr[j + 1]) {
c = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = c;
}
}
}
return arr;
}
let arr = [1, 4, 6, 67, 111, 45, 2, 5];
bubbleSort(arr)