要求:使用 JS 实现冒泡排序。
步骤:
1、先准备一个数组
var arr = [5, 6, 1, 8, 2, 4, 9, 7, 3]
2、冒泡排序的核心就是把两个位置的数据交换;当我们交换数据时,需要引入一个变量,来实现交换(这里我们先使用arr[0]和arr[1]举例)。
var tmp = arr[0]
arr[0] = arr[1]
arr[1] = tmp
3、我们通过循环遍历数组,依次比较前后两位并进行交换;通过依次的循环,可以把最大的那位数换到最后面。
for (var i = 0; i < arr.length - 1; i++) {
/*
arr.length 为9,但是i从0开始,数组下标也是从0开始,
因此arr[9]为空,那么arr[8]与arr[9]比较就没有了意思,
可以少循环一次
*/
// 进行判断,把大的数据和后面进行交换
if (arr[i] > arr[i+1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
4、通过遍历一次数组只能,把最大数换到最后,因此要想把所用数组内元素排完就需要8次;
for (var j = 0; j < arr.length - 1; j++) {
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
}
5、通过上面就可以排好序了,但是,可以发现每经过一次外循环,就会有一个最大数排好,因此,我们每经过一次外循环可以减少一次比较;优化后代码如下:
var arr = [5, 6, 1, 8, 2, 4, 9, 7, 3]
for (var j = 0; j < arr.length - 1; j++) {
for (var i = 0; i < arr.length - 1 - j; i++) {
// 外循环 循环一次可以少比较一次
if (arr[i] > arr[i + 1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
}
console.log(arr)
最后,冒泡排序口诀:双层for 循环,一层减一次; 里层减外层,变量相交换。