优化冒泡排序,js实现。

125 阅读1分钟

优化1

冒泡排序在冒泡到最后一轮之前,可能该数组就已经有序了。
解决办法:迭代之前加个已经排序标识,在每次交换顺序时让标识为false,该次迭代没交换元素顺序,说明已经有序,直接返回。

优化2

冒泡过程中,有可能后面有一大部分元素已经有序,则我们就可避免后面已经有序的一堆元素的循环,而不是每次值排除一个元素。
解决办法:可通过前一次迭代最后一次交换的元素得到后面已有序元素长度,数组的hi等于最后一次交换位置元素下标。

代码

function bubbleSort(arr) {
    let hi = arr.length
    let unSorted = true
    for(let i = 0;i<arr.length;i++){
        //如果上次迭代没进if说明已经排好序,就返回。
        if(!unSorted) return arr
        //获取上次迭代最后一次交换位置的元素,初始化为hi-1因为每次迭代,右边有序必+1。
        let last = hi-1
        for (let j = 1;j<hi;j++){
            unSorted = false
            if(arr[j-1]>arr[j]){
                unSorted = true
                let temp = arr[j-1]
                arr[j-1] = arr[j]
                arr[j] = temp
                last = j
            }
        }
        // 下一次循环,让右边已有序的,不在循环范围内。
        hi = last
    }
    return arr
}
console.log(bubbleSort([3,1,5,6,7,8,9,10,2]))