/**
* 冒泡排序
*/
var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1]
// 0 1 2 3 4 5 6 7 8
for (var k = 0; k < arr.length - 1; k++) {
for (var i = 0; i < arr.length - 1 - k; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
}
/**
* 优化3
*
* 我们对比后发现每一轮外层循环之后完毕之后, 就可以确定一个数字(最大值已经放在最后了)
*
* 第 1 次执行, k === 0, 没有确定的数字
* 第 2 次执行, k === 1, 最后 1 位的值已经确定了 (9)
* 第 3 次执行, k === 2, 最后 2 位的值已经确定了 (8, 9)
* 第 4 次执行, k === 3, 最后 3 位的值已经确定了 (7, 8, 9)
* 第 5 次执行, k === 4, 最后 4 位的值已经确定了 (6, 7, 8, 9)
* 第 6 次执行, k === 5, 最后 5 位的值已经确定了 (5, 6, 7, 8, 9)
* ......
*
* 结合上述的规律我们能够发现, 每一轮外层循环执行完毕, 数组内都能多一个没必要参与冒泡对比的数字
*
* 又因为内层循环是控制我们的冒泡对比执行多少次的, 所以我们将 内层循环 - k
* 目的是为了减少对比次数, 优化运行效率
*/
// for (var k = 0; k < arr.length - 1; k++) {
// for (var i = 0; i < arr.length - 1 - k; i++) {
// console.log('当前是第', k + 1, '次循环(外循环), 当前对比的是', arr[i], arr[i + 1], '当前k的值: ', k)
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('当前循环执行完毕后的数组: ', arr)
// console.log('======================================================')
// }
/**
* 优化2
*
* 内层循环 - 1 的原因
* 在当前案例中, arr.length === 9
*
* 所以 i 的最大值为 8, 因此最后一轮对比的时候是 arr[8] 和 arr[9] 做对比
* 数组中其实是没有 [9] 的, 所以最后一轮对比没有意义
*
* 因此我们减少一轮对比
*/
// for (var k = 0; k < arr.length - 1; k++) {
// for (var i = 0; i < arr.length - 1; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// }
// console.log(arr)
/**
* 优化1
*
* 外层循环 - 1 的原因:
* 如果不减1我们会发现, 执行到倒数第二轮的时候, 就剩下一个数字和一个位置没有做冒泡对比了
*
* 但是这个时候其实就没有必要做对比了, 因此, 我们省略了最后一次的冒泡对比
*/
// for (var k = 0; k < arr.length - 1; k++) {
// // 循环遍历数组, 拿到数组内的所有元素, 然后判断前后两项, 将较大值往后放
// for (var i = 0; i < arr.length; i++) {
// // 判断前后两项, 将较大值往后放
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 ', k, ' 轮循环执行完毕后: ', arr)
// }
// console.log('冒泡排序后的数组: ', arr)
// 基本写法
// for (var k = 0; k < arr.length; k++) {
// // 循环遍历数组, 拿到数组内的所有元素, 然后判断前后两项, 将较大值往后放
// for (var i = 0; i < arr.length; i++) {
// // 判断前后两项, 将较大值往后放
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }shu
// }
// // console.log('第 ', k, ' 轮循环执行完毕后: ', arr)
// }
// console.log('冒泡排序后的数组: ', arr)