排序算法之冒泡排序

這裏是傳送門⇒總結:關於排序算法html



平均時間複雜度 最優時間複雜度 最差時間複雜度 空間複雜度 穩定性
冒泡排序 O(n2) O(n2) O(n2) O(1) 穩定
優化後 O(n2) O(n) O(n2) O(1) 穩定


  • 算法描述
    • 從頭開始,依次比較相鄰元素,若是前者比較大,則交換二者位置
    • 比較一輪以後,最大的元素被「冒泡」到最後
    • 繼續從頭開始比較相鄰元素,把倒數第二大的元素「冒泡」到倒數第二的位置
    • ...直到全部元素都冒泡完畢
  • JS實現
// 使用公用函數Swap
// 交換array[i]和array[j]
function Swap(array, i, j) {
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

// 此處傳入的array會被直接改變
function BubbleSort(array) {
    var len = array.length;
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                Swap(array, j, j + 1);
            }
        }
    }
}
  • 分析
    • 基操是鍵值的比較
    • 無論哪一種狀況下,鍵值的比較的次數都是
    • 任何狀況下的時間複雜度都爲T(n) = O(n2)
    • 而該排序是直接交換待排序列的元素位置,即原地排序,因此空間複雜度爲O(1)
    • 而在相鄰元素的比較中,只有當前者比後者大時才交換位置,因此同樣大的元素的先後位置不會改變,即冒泡排序是一種穩定排序算法
  • 優化
    • 算法中加上一個didswap的變量,用來代表當前這一輪的全部鍵值比較中是否有須要交換位置的狀況
    • 讓diswap一開始爲false
    • 當一輪比較中有任何須要交換元素的狀況出現,那麼就把didswap設爲true
    • 在一輪比較以後判斷didswap的值,若是爲false,那麼直接結束算法了
    • 由於在一輪比較以後,若是didswap仍是false,這說明待排序列的相鄰元素之間已經沒有須要交換位置的狀況了
    • 也就是說相鄰元素之間如今都是「前者小於等於後者」的關係,即待排序列已是一個升序序列了
    • 該優化能夠把冒泡排序算法的最優時間複雜度變爲O(n)
  • 優化版的JS實現
// 此處傳入的array會被直接改變
function BubbleSortPlus(array) {
    var len = array.length;
    var didswap;
    for (var i = 0; i < len - 1; i++) {
        didswap = false;
        for (var j = 0; j < len - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                Swap(array, j, j + 1);
                didswap = true;
            }
        }
        if (!didswap) {
            break;
        }
    }
}
相關文章
相關標籤/搜索