冒泡排序與快速排序

昨天,閒下來看了下冒泡排序與快速排序的區別。
兩者區別還是挺大,思路完全不一樣。
我們先看冒泡排序,冒泡是通過比較相鄰兩個元素的大小來調換順序,循環下去。代碼如下

// 冒泡排序
    function bubble(arr) {
        let n = 0
        for (var i = arr.length - 1; i >= 0; i--) {
            let change = false
            for (var j = 0; j < i ; j ++){
                n++
                if (arr[j] > arr[j+1]){
                    let a = arr[j+1]
                    arr[j+1] = arr[j]
                    arr[j] = a
                    change = true
                }
            }
            // 優化,減少循環次數
            if (!change){
                break
            }
        }
        console.log(n) //循環次數
        return arr
    }

再看快速排序,我覺得也可以叫二分法排序,這是一種通過遞歸將數組分兩邊的排序方法。先取中間元素a[a.length/2], 比較中間元素與每一個元素的大小,比他大的push到一個數組中,小的push到另一個數組中,然後遞歸下去,代碼如下

// 快速排序
    var num = 0 // 總的循環次數
    function quick(arr){
        if(arr.length<=1){
            return arr
        }
        let n = 0 //每次函數調用的循環次數
        let midIndex = Math.floor(arr.length/2)
        let mid = arr.splice(midIndex,1)
        let left = []
        let right = []
        for (var i = 0; i < arr.length; i++) {
            n++
            if (arr[i]>midIndex) {
                right.push(arr[i])
            } else {
                left.push(arr[i])
            }
        }
        console.log(n)
        num += n
        return quick(left).concat(mid,quick(right))
    }

下面我們通過 一個數組去測試兩者的效率,爲了體現區別,我們的數組長度多一點

let arr = [23, 34, 54,12, 34, 3, 4, 13, 29, 89, 223, 33, 45, 665, 335, 7, 17, 90, 40]

放入上面兩個函數中,冒泡排序中n的值是161,快速排序中 num 的值是126
由此可見,兩者差別還是挺大,如果數組長度是100,那效率就差很多了。所以推薦大家遇到排序問題,儘量用快速,不僅逼格高,效率還槓槓的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章