基本思路
- 每次对两个值的比较
- 前一个比后一个值大就交换位置
- 前一个比后一个值小就不动
- 每次比较完成后都会把最大的值放到最后面
时间复杂度
var arr = [5, 2, 3, 1, 4];let bSort = (arr) => {for(let i = 0; i < arr.length - 1; i++) {for(let j = 0; j < arr.length - 1; j++) {if(arr[j] > arr[j+1]) {let swap = arr[j];arr[j] = arr[j+1];arr[j+1] = swap;}}}return arr;}console.log(bSort(arr));
优化点
- 当外层循环完成一次,内层循环的判断可以为外层循环次数 - 1,已经冒出的值不用再比较
j < arr.length - i - 1 - 如果在某次内层循环中没有交换过值,即说明已经排序好没必要继续比较冒泡
let flag = false;如果出现值交换flag = true;每次内层循环完成后对 flag 进行判断,如果 flag 还是 false 那么排序已经完成直接 return arr;let bSort = (arr) => {for(let i = 0; i < arr.length - 1; i++) {let flag = false;for(let j = 0; j < arr.length - i - 1; j++) {if(arr[j] > arr[j+1]) {let swap = arr[j];arr[j] = arr[j+1];arr[j+1] = swap;flag = true;}}if(!flag) return arr;}return arr;}
