【面对一个乱序数组,如何通过双层循环和变量交换,让数据像气泡一样逐一浮到正确位置?】
+ 排序 : 把一个乱序的数组, 通过代码的方式调整成有序的数组 (正序或者倒序)
+ 冒泡的原理 :
=> 第一个数字和第二个数字进行比较, 如果第一个比第二个大, 就交换位置
=> 以此类推, 直到数组遍历完毕, 最大的一定在最后面
=> 重复执行第一轮的操作, 直到所有数字排好
// 0. 准备一个乱序的数组
var arr = [ 9, 3, 6, 2, 4, 1, 8, 5, 7 ]
1. 把数组内两个数据交换位置 , 利用一个临时变量 tmp 来实现交换位置 :
假设我希望 [0] 和 [1] 位置交换数据 :
var tmp = arr [0]
arr [0] = arr [1]
arr [1] = tmp
2. 因为一共 9 个数字, 所以执行 8 遍 :
一共多少个数字, 数组的 length 就是多少 , 只需执行 ( length - 1 ) 遍
( 因为最后一位数字在前面的数字都执行完排序操作后会移动到最后位置 )
基础冒泡排序 :
for (var j = 0; j < arr.length - 1; j++) {
// 循环遍历数组, 依次比较当前这个数字和下一个数字的大小关系
for (var i = 0; i < arr.length; i++) {
// 数组内的每一个数据是什么 ? arr[i]
// 数组内的下一个数据是什么 ? arr[i + 1]
// 判断 arr[i] 和 arr[i + 1] 的大小关系
if (arr[i] > arr[i + 1]) {
// 让 [i] 和 [i + 1] 交换位置
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
}
console.log(arr);
优化 :
(1) 没有必要循环遍历到 length 次
因为循环遍历, 当 i 等于最后一位的索引的时候, i + 1 一定是超出的索引位置
(即 : i 为 8 if ( arr[ 8 ] > arr[ 9 ] ) { } , 而 arr[ 8 + 1 ] 的值为 undefined , 比较无意义)
优化后 : 只需循环遍历到 length - 1 次 ( i < arr.length - 1 )
(2) 其实也没有必要每次都循环到 length - 1 次 :
( 因为每一次循环过后 , 后面的都已经排序好了位置 , 所以无需再次对其进行排序操作 )
优化后 : 只需循环遍历到 length - 1 - j 次 ( i < arr.length - 1 - j )
End :
+ 秘籍口诀:
=> 双层 for 循环 , 一层减一次
=> 里层减外层 , 变量相交换
冒泡排序:
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)
简图 :