#冒泡排序
例如:[3,2,4,1]
第一遍:[2,3,1,4]
第二遍:[2,1,3,4]
第三遍:[1,2,3,4] //结束
基础版
for(let i = 0;i<arr.length - 1;i++){//控制比较轮次,一共 n-1 趟
for(let j=0;j<arr.length - 1 - i;j++){//控制两个挨着的元素进行比较
if(arr[j] > arr[j+1]){
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
优化版 :
说明:判断本次循环是否进行了交换
true:则说明还排序完成
false:则说明排序已经完成,没必要继续循环下去了
for (let i = 0; i < arr.length - 1; i++) {
const isSorted = false;//有序标记,每一轮的初始是false
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j + 1] < arr[j]) {
isSorted = true;//有元素交换,所以不是有序,标记变为true
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//一趟下来是否发生位置交换,如果没有交换直接跳出大循环
if(isSorted )
break;//结束循环
}
升级版:
例如:[3,4,2,1,5,6,7,8]
前半部分有序,后半部分无序,会导致白白进行比较
//记录最后一次交换的位置
let lastExchangeIndex = 0;
//无序数列的边界,每次比较只需要比到这里为止
let sortBorder = arr.length - 1;
for (let i = 0; i < arr.length - 1; i++) {
const isSorted = false;//有序标记,每一轮的初始是false
for (let j = 0; j < sortBorder; j++) {
if (arr[j + 1] < arr[j]) {
isSorted = true;//有元素交换,所以不是有序,标记变为true
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex
//一趟下来是否发生位置交换,如果没有交换直接跳出大循环
if(isSorted )
break;//结束循环
}