算法流程
比較相鄰的元素,如果第一個比第二個大,就交換,從第一對元素開始到最后一對元素做同樣的工作,每次都重復以上步驟,當遍歷arr.length-1
次后,遍歷完所有的元素
復雜度
時間復雜度為:O(n^2)
代碼實現
代碼:
function bubbleSort(arr){
for(var i = 0; i < arr.length-1; i++){
for(var j = 0;j < arr.length-i;j++){
if(arr[j] > arr[j+1]){
var t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
return arr;
}
var arr = [1,4,2,5,3];
bubbleSort(arr); // [1 , 2 , 3 , 4 , 5]
算法優化
當待排序數組為[1, 3, 4, 5, 6, 7, 8, 9, 2]時:
第1趟排序的結果為: 1 2 3 4 5 6 7 8 9
此時其實序列已經完成,但是根據上述代碼仍得繼續遍歷,直至第9趟排序。這顯然是不合理的,如果我們能在代碼中加入一個flag標記上一趟排序中是否進行過交換,如果進行過未進行交換,說明當前數組以及有序。
代碼如下:
function bubbleSort(arr){
var flag = true;
while(true){
flag = false;
for(var i = 0; i < arr.length-1; i++){
for(var j = 0;j < arr.length-i;j++){
if(arr[j] > arr[j+1]){
var t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = true;
}
}
}
}
return arr;
}
var arr = [1, 3, 4, 5, 6, 7, 8, 9, 2];
bubbleSort(arr); //[1, 2, 3, 4, 5, 6, 7, 8, 9]