排序算法之冒泡排序

冒泡排序經典的排序算法,實現的思想是通過兩兩相鄰的元素比較,使較大的數字不斷向隊列上部浮動,就如同水裏的一個氣泡一般不斷向上浮,所以纔得到一個"冒泡排序"好聽的名字。

wKioL1e1LP2hXdsiAACp2m90VC4671.png-wh_50圖片轉載


那接下來我通過一個小例子來看看冒泡排序的實現:

[7,4,1,8,2]

上面的數組實現從小到大排序。

因爲冒泡排序是兩兩相鄰比較,所以

step1 
  7與4比較,7>4,交換位置後得數組:[4,7,1,8,2]
  
step2
  7與1比較,7>1,交換位置後得數組:[4,1,7,8,2]
  
step3
  7與8比較,7<8,不進行交換得數組:[4,1,7,8,2] 
  
step4
  8與2比較,8>2,交換位置後得數組:[4,1,7,2,8]

至此第一輪冒泡結束,我們看到數組中元素最大的8已經到了最後,這就是經過一輪冒泡,最大的元素已經浮動到最上面。之後只要重複這4個步驟就可以了。

但是這個沒經優化的冒泡排序的時間複雜度是O(N2)。


優化的思想就是:如果數組中某個元素到最後一個元素是已經排好序的,那麼這段數據就不需要進行比較並排序了。

[2,1,4,5,6,7,8]

像這個數組中,[4,5,6,7,8]是已經排好序的,只需要排[2,1]就ok。


代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>冒泡排序</title>
    <script type="text/javascript">
        function myclick(){
            var value = document.getElementById("sort_array").value;
            var array = value.split(",");
            document.getElementById("echo_array").value = mysort(array).toString();

        }
        //排序算法
        function mysort(arr){
            var i,flag = 1,temp,j=arr.length;
            while(flag){

                flag = 0;//每次數組的循環之前置爲0
                for(i=1;i<j;i++){
                    if(parseInt(arr[i])>parseInt(arr[i-1])){
                        temp = arr[i];
                        arr[i] = arr[i-1];
                        arr[i-1] = temp;
                        flag = 1;//標誌位,如果有交換則置爲1

                    }
                }
                j = i;//記錄最後一次交換的數組下標
            }
            return arr;
        }
    </script>
    <style type="text/css">
        input{
            width: 300px;
        }
    </style>
</head>
<body>
    <label>請輸入待排序的數字,用逗號隔開:</label><input type="text" id="sort_array"/>
    <label>請輸入待排序的數字,用逗號隔開:</label><input type="text" id="echo_array"/>
    <input type="button" value="排序" onclick="myclick()"/>
</body>
</html>

這樣經過優化過的算法最好的時間複雜度是O(n),最壞的情況下還是O(N2)


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