冒泡排序的練習

今天跟同學探討了排序算法中的冒泡排序,很早之前其實就寫過這個代碼,但是一直沒有正式的寫到博客中來,其實冒泡排序是九大排序中最簡單的一個,也是最容易理解的一個排序,好了,廢話不多說,我們先來談一下冒泡排序的思想。 
冒泡排序的思想:我們以從小到大排列爲例,所謂冒泡排序就是在無序數組中每執行一趟選出這一趟中最大的數放在最後面,第二趟選出次大的數放在倒數第二位上,以此類推直到完成排序。下來貼代碼: 
第一種方式

var arr=[2,5,4,2,1];
var x;
for(var i=0;i<arr.length-1;i++){
    for(var j=0;j<arr.length-i-1;j++){
        if(arr[j]>arr[j+1]){
            x=arr[j+1];
            arr[j+1]=arr[j];
            arr[j]=x;
        }
    }
    console.log("第"+(i+1)+"趟排序後的數組是"+arr);
}
console.log(arr);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

運行效果如下: 
這裏寫圖片描述

在這裏我們用了兩個循環來完成排序,第一個for循環是用來控制執行冒泡的趟數,這裏爲什麼是arr.length-1,比如我們如果是兩個數排序那麼最多只需要比較一次就可以了,同樣如果是n個數我們最多隻需冒泡n-1次就可以了,第二個循環我們是用來控制每一趟冒泡所需比較的數的個數,這裏爲什麼是arr.length-i-1,因爲每冒泡一次就會選出一個最大值,然後下一次冒泡就不用再去比較前一趟所冒泡的最大值了所以長度就會減去i。 
第二種方式 
主要還是對第一種方式的優化,我們設置一個標誌,如果這一趟發生了交換,則爲true,否則爲false。如果有一趟沒有發生交換,則說明排序已經完成。代碼如下:

var arr=[2,5,4,2,1];
var n=arr.length;  
var flag=true;  
while(flag)  
{  
      flag=false;  
      for(var j=1;j<n;j++){ 
            if (arr[j-1]>arr[j])  
            {  
                    x=arr[j-1];
                    arr[j-1]=arr[j];
                    arr[j]=x;
                    flag=true;  
            }
        }
        n--; 
}
console.log(arr);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

第三種方式 
是對前兩種方式的進一步優化,假如數組長度是20,如果只有前十位是無序排列的,後十位是有序且都大於前十位,所以第一趟遍歷排序的時候發生交換的位置必定小於10,且該位置之後的必定有序,我們只需要排序好該位置之前的就可以,因此我們要來標記這個位置就可以了,代碼如下:

var arr=[2,5,4,2,1];
var n=arr.length;
var j,k;  
var flag=n;
while(flag>0)  
{  
    k=flag;  
    flag=0;  
    for(j=1;j<k;j++){ 
        if (arr[j - 1] > arr[j])  
        {  
            x=arr[j-1];
            arr[j-1]=arr[j];
            arr[j]=x;
            flag=j;  
        }  
    }  
} 
console.log(arr);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

最後需要注意的是冒泡排序最好的時間複雜度爲O(n),最壞是O(n^2),平均時間複雜度是O(n^2),且是穩定的排序算法,冒泡排序雖然說是一種簡單且容易理解的排序,但是畢竟是一種效率低下的排序方法,在數據規模很小時,可以採用。

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