排序算法01:冒泡排序

算法介紹

步驟:
1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2. 對第0個到第n-1個數據做同樣的工作。這時,最大的數就“浮”到了數組最後的位置上。
3. 針對所有的元素重複以上的步驟,除了最後一個。
4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

可視化效果:這裏

Javascript實現


/**
 * Created by YiYing on 2017/4/22.
 */
(function (W) {

    function Bubble(arr) {
        this.arr = arr;
    }

    /**
     * 冒泡排序算法實現
     */
    Bubble.prototype.sort = function () {
        var len = this.arr.length;
        for(var i=0;i<len;i++){
            //將最大的元素不斷的沉到底部
            for(var j=0;j<len-i-1;j++){
                if(this.less(j+1,j)){
                    this.exchange(j+1,j);
                }
            }
        }
    };

    /**
     * 判斷m是否小於n
     * @param m
     * @param n
     */
    Bubble.prototype.less = function (m,n) {
        //可根據不同的數據類型設置比對規則,比如json。這裏適用於數字與字符串。
        return this.arr[m]<this.arr[n];
    };

    /**
     * 交換數組中m與n的位置
     * @param m
     * @param n
     */
    Bubble.prototype.exchange = function (m,n) {
        var swap    = this.arr[m];
        this.arr[m] = this.arr[n];
        this.arr[n] = swap;
    };

    /**
     * 打印排序後的數組
     */
    Bubble.prototype.show = function () {
        console.log(this.arr);
    };

    /**
     * 判斷是否已排序
     * @returns {boolean}
     */
    Bubble.prototype.isSorted = function () {
        var len = this.arr.length;
        for(var i=1;i<len;i++){
            if(this.less(i,i-1)){
                return false;
            }
        }
        return true;
    };

    W.Bubble = Bubble;
})(window);

//測試代碼
(function () {
    var arr = [4,5,6,0,3,5,21,7,9,0,1];
    var bubble = new Bubble(arr);
    console.log("排序前:"+bubble.isSorted());
    bubble.sort();
    console.log("排序後:"+bubble.isSorted());
    bubble.show();
})();

總結

  1. 穩定。相同元素排序後能保持排序前的相對順序。
  2. 原地排序。
  3. 時間複雜度爲:平方級別。
  4. 空間複雜度爲:常數級別。

GitHub:https://github.com/AlbertKnag/algs-practice

下一篇:排序算法02:選擇排序

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