1.冒泡排序基本思路
基本思路是对相邻记录值进行比较,如果符合条件,则将两者进行交换,最终达到有序变化。
const arr = [9,0,4,6,1,2,7,3,5,8]
function bubbling (arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length-1; j++) {
if (arr[j+1] < arr[j]) {
// let middle = arr[j+1]
// arr[j+1] = arr[j]
// arr[j] = middle
[arr[j],arr[j+1]] = [arr[j+1],arr[j]]
}
}
}
return arr
}
let result = bubbling(arr)
console.log(arr) // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
2.冒泡排序的优化1
规律:
- i = 0 时排好了 9
- i = 1 时 排好了 8
- i = n …
- 所以在j的遍历次数应该是递减的。例如 第一次遍历9次确定9,第二次遍历8次即可确定8(8总会比9小),第三次遍历7次即可(7没必要可8、9比了)。
- 所以 for (let j = 0; j < arr.length-1; j++) 改为 for (let j = 0; j < arr.length-1-i; j++),加个-i。
3.冒泡排序的优化2
const arr = [8,0,4,6,1,2,7,3,5,9];
let num = 0;
function bubbling (arr) {
const len = arr.length;
// 添加一个标志位
let flag = true
// 如果标志位为true的时候才执行循环
for(let i = 0;i < len && flag;i++) {
// 将标志位置为false
flag = false
console.log(`第${num++}次执行`)
for(let j = 0;j < len - 1 - i;j++) {
if (arr[j] > arr[j + 1]) {
let middle = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = middle
// 如果有交换,说明数组不是有序的,则继续进行循环
flag = true
}
}
}
return arr
}
let result = bubbling(arr)
console.log(result)
//
第0次执行
第1次执行
第2次执行
第3次执行
第4次执行
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
- 当执行到第4次的时候,由于没有if (arr[j] > arr[j + 1])条件不达成,所以flag = false了,不用遍历了。