算法介紹
步驟:
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();
})();
總結
- 穩定。相同元素排序後能保持排序前的相對順序。
- 原地排序。
- 時間複雜度爲:平方級別。
- 空間複雜度爲:常數級別。
GitHub:https://github.com/AlbertKnag/algs-practice
下一篇:排序算法02:選擇排序