首先講一下冒泡排序的基本算法思想 。
假設有這樣一個數組 var arr = [3,4,6,1,7,2,5,8]; 需要我們從小到大對其進行排序。我們從數組的第一個元素開始,依次比較相鄰的兩個元素,若前邊的數大於後邊的數,則對它們進行位置交換。即第一次比較arr[0]與arr[1] ,繼續比較arr[1] 與arr[2] ,再繼續比較arr[2] 與arr[3] ,依次類推 。
if(arr[j] >arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
當第一次所有比較執行完畢後,我們得到了這樣一個數組[3, 4, 1, 6, 2, 5, 7, 8] ,數組的末尾就是數組中的最大值(因爲是逐次比較交換的,所以數組的末尾一個必然是最大值)。
下一次我們依舊從數組的第一個元素開始執行相鄰比較的算法。但是由於我們末尾的已經排好序所以只需要比較到length– 1 , 執行的結果是相當於對一個新的數組又求出了最大值,並擺放在了數組的末尾。這樣一來,下次我們繼續執行算法的時候又少了一次執行。執行次數變成了 length-2 ,於是我們發現了規律,當第i次 執行算法的時候,只比較了length-i次.
for(var j = 0; j< arr.length-i; j++){ // arr[j] 代表當前循環到的數,從末尾倒數i
// 個數都是已排好序的所以不需要對它們進行判斷。
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j]= arr[j+1];
arr[j+1] = temp;
}
}
因爲我每執行完一次相鄰比較的算法都需要從頭開始重新執行算法,直到該數組從末尾開始數length-1 個數都是已經排好序的,這時也無需再對數組執行算法 ,我們所能得到的數組就是一個已經從小到大排好序的數組。於是就有了如下的完整代碼:
var arr = [3,4,6,1,7,2,5,8];
for(var i = 0; i< arr.length-1; i++){ //i 控制循環的次數
for(var j = 0; j<arr.length-i; j++){
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}