冒泡排序是什么机制
有这么一组数据,要进行从小到大的冒泡排序。
var arr = [23,79,40,19,57];
根据冒泡排序的机制,让相邻的两个数进行两两比较,如果第一个数大于第二个数,则两个数交换位置。
第一轮比较
- 让23和79进行比较,23不大于79,位置不变
- 79和40进行比较,79>40,两个数交换位置
- 79和19进行比较,79>19,两个数交换位置
- 79和57比较,79>57,两个数交换位置
第二轮比较(节省篇幅:图解只展示最终结果)
- 23和40比较,23不大于40,位置不变
- 40和19比较,40>19,两个数交换位置
- 40和57比较,40不大于57,位置不变
第三轮比较
- 23和19比较,23>19,两个数交换位置
- 23和40比较,23不大于40,位置不变
第四轮比较
- 19和23比较,19不大于23,位置不变。
注:第五轮不再需要比较
规律
综上所述,可以抽离出一些规律,用来整理代码逻辑。
- 数组长度为5
- 进行了4轮比较
- 每轮分别进行了4,3,2,1次两两比较
- 第一轮进行了4次比较
- 第一轮进行了4次比较
- 第二轮进行了三次比较
- 第三轮进行了两次比较
- 第四轮进行了一次比较
实现思路
根据上述总结规律,可以使用双层for循环来分别控制四轮循环和每轮循环里比较次数。
循环
- 外层循环
- 假设使用外层for循环来控制循环轮数,可以这样写:
for(var i=1;i<arr.length;i++){ console.log(i) // output:1,2,3,4 }
- 也可以这样写:
for(var i=0;arr.length-1;i++){ console.log(i) // output:0,1,2,3 }
- 假设使用外层for循环来控制循环轮数,可以这样写:
如此一来就可以做到数组长度为5时,循环4轮。
- 内层循环
- 内层循环要做到4,3,2,1,就要找到j跟arr.length的联系,这样才可以做到不管多长的数组,都能自动排序。
- arr.length为5时,就可以根据arr.length-i,获得对应的j;
- 本例中,arr.length固定为5;
- i为1时,arr.length-i=4;
- i为2时,arr.length-i=3;
- i为3时,arr.length-i=2;
- i为4时,arr.length-i=1;
- 可以这样写:
for(var j=0;j<arr.length-i;j++){ console.log(j) // output:0,1,2,3//0,1,2//0,1//0 }
交换变量
循环问题解决之后,交换变量的事情,就可以当作循环体写进循环内即可。
思路就是让arr[j]和arr[j+1]进行比较,如果arr[j]>arr[j+1],则让两个变量交换位置。
需要注意的是,交换变量,需要一个temp中间变量来进行中转。
var temp = '';
if (arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
实现总结
var arr = [23,79,40,19,57];
for (var i = 1; i < arr.length; i++) {
for (var j = 0; j < arr.length-i; j++) {
var temp = "";
if (arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr) // output: [ 19, 23, 40, 57, 79 ]