冒泡排序与快速排序

昨天,闲下来看了下冒泡排序与快速排序的区别。
两者区别还是挺大,思路完全不一样。
我们先看冒泡排序,冒泡是通过比较相邻两个元素的大小来调换顺序,循环下去。代码如下

// 冒泡排序
    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,那效率就差很多了。所以推荐大家遇到排序问题,尽量用快速,不仅逼格高,效率还杠杠的

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