/**
* 冒泡排序(优化版本,增加有序标记,提前终止循环)
* 核心思想:相邻元素两两比较,大的往后冒泡,每一轮把当前未排序区间最大值移到末尾
* @param {number[]} arr - 待排序数组
* @returns {number[]} 排序后的数组(原地修改)
*/
function bubbleSort(arr) {
const len = arr.length
// 数组长度小于等于1,本身已有序,直接返回
if (len <= 1) return arr
// i 控制冒泡轮数
for(let i = 0; i < len; i++) {
// 标记本轮是否发生交换,默认无交换
let isChange = false
// j 相邻比较,每一轮结束后末尾i个元素已经排好序,无需再比较
// len - 1 - i:避免j+1越界,同时跳过尾部已有序元素
for(let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
isChange = true
}
}
// 如果本轮没有任何交换,说明数组已经整体有序,直接退出外层循环
if (!isChange) break
}
return arr
}
console.log(bubbleSort([3, 1, 5, 7, 2, 4]))
console