算法基礎之冒泡排序

首先講一下冒泡排序的基本算法思想  。

假設有這樣一個數組 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;

        }

    }

}

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