前言
闲的没事,去看了一下冒泡排序,记录一下,有错的地方希望大神能指出来
/**
* 冒泡算法
* 原理:
* 1、将数组进行两两对比,将值大的换到右边,对每一个相邻的执行这个操作,一轮下来就会把最大的排到最后
* 2、将数组进行数组长度-1轮的比较,就会得到有序的数组
* 核心:就是两两比较,将最大的放到末尾(如果想从大到小排序也可以是反过来)
* 原始数组 [2, 6, 4, 8, 7, 3, 9]
* 第一趟
*2和6比较,2比6小,位置不变 [2, 6, 4, 8, 7, 3, 9]
*6和4比较,6比4大,位置交换 [2, 4, 6, 8, 7, 3, 9]
*6和8比较,6比8小,位置不变 [2, 4, 6, 8, 7, 3, 9]
*8和7比较,8比7大,位置交换 [2, 4, 6, 7, 8, 3, 9]
*8和3比较,8比3大,位置交换 [2, 4, 6, 7, 3, 8, 9]
*8和9比较,8比9小,位置不变 [2, 4, 6, 7, 3, 8, 9]
第一趟完成,比较六次,此时就把最大的沉到了最后,所以第二趟我们就不比较最后一位了
[2, 4, 6, 7, 3, 8, 9]
第二趟
*2和4比较,2比4小,位置不变 [2, 4, 6, 7, 3, 8, 9]
*4和6比较,4比6小,位置不变 [2, 4, 6, 7, 3, 8, 9]
*6和7比较,6比7小,位置不变 [2, 4, 6, 7, 3, 8, 9]
*7和3比较,7比3大,位置交换 [2, 4, 6, 3, 7, 8, 9]
*7和8比较,7比8小,位置不变 [2, 4, 6, 3, 7, 8, 9]
第二趟完成,比较五次,此时找到到二大的
[2, 4, 6, 3, 7, 8, 9]
第三趟
*2和4比较,2比4小,位置不变 [2, 4, 6, 3, 7, 8, 9]
*4和6比较,4比6小,位置不变 [2, 4, 6, 3, 7, 8, 9]
*6和3比较,6比3大,位置交换 [2, 4, 3, 6, 7, 8, 9]
*6和7比较,6比7小,位置不变 [2, 4, 3, 6, 7, 8, 9]
第三趟完成,比较四次,此时找到到三大的
[2, 4, 3, 6, 7, 8, 9]
第四趟
*2和4比较,2比4小,位置不变 [2, 4, 3, 6, 7, 8, 9]
*4和3比较,4比3大,位置交换 [2, 3, 4, 6, 7, 8, 9]
*4和6比较,4比6小,位置不变 [2, 3, 4, 6, 7, 8, 9]
第四趟完成,比较三次,此时找到到四大的
[2, 3, 4, 6, 7, 8, 9]
第五趟
*2和3比较,2比3小,位置不变 [2, 3, 4, 6, 7, 8, 9]
*3和4比较,3比4小,位置不变 [2, 3, 4, 6, 7, 8, 9]
第五趟完成,比较两次,此时找到到五大的
[2, 3, 4, 6, 7, 8, 9]
第六趟
*2和3比较,2比3小,位置不变 [2, 3, 4, 6, 7, 8, 9]
*第六趟结束,全部循环也结束了
*/
const arr = [2, 6, 4, 8, 7, 3, 9]
for (let i = 0; i < arr.length-1; i++) {
console.log(i)
for (let j = 0; j < arr.length-1 - i; j++) {
if (arr[j] > arr[j + 1]) {
const temp = arr[j + 1]
arr[j + 1] = arr[j]
arr[j] = temp;
}
}
}
console.log(arr)
算法改进
从上边的结果可以看到,在第四趟比较完成后数组已经是有序的了,但是我们没有进行检测,所以继续走了第五趟和第六趟,我们进行第五趟的时候都没有进行交换,在这种情况下不应该在进行第六趟去消耗性能,所以我们应该设置一个变量去检测当前是否进行了交换,如果没有,那么此时的数组就是有序的,我们不需要再进行比较了
let isChange = true;
const arr = [2, 6, 4, 8, 7, 3, 9]
for (let i = 0; i < arr.length - 1 && isChange; i++) {
console.log(i)
isChange = false;
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
const temp = arr[j + 1]
arr[j + 1] = arr[j]
arr[j] = temp;
isChange = true
}
}
}