SOURCE

/**
 * 冒泡排序(优化版本,增加有序标记,提前终止循环)
 * 核心思想:相邻元素两两比较,大的往后冒泡,每一轮把当前未排序区间最大值移到末尾
 * @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 命令行工具 X clear

                    
>
console