排序算法之希爾排序

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



平均時間複雜度 最優時間複雜度 最差時間複雜度 空間複雜度 穩定性
希爾排序 *O(n1.3) *O(n) *O(n2) O(1) 不穩定


希爾排序是直接插入排序的改進版本。直接插入排序每次只能讓數據移動一位,而希爾排序是經過比較相距必定間隔的元素來進行,各趟比較所用的距離隨着算法的進行而減少,因此希爾排序又稱「縮小增量排序」算法

  • 算法描述
    • 把待排序列按照必定「增量」分組,對每一組都採用直接插入排序
    • 移動位數可達給定「增量」
    • 漸減「增量」至1時,整個待排序列爲1組,結束(常見爲減半「增量」,稱「希爾增量」)
  • JS實現
// 此處傳入發array會被直接改變
function ShellSort(array) {
    var len = array.length;
    for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
        for (var i = gap; i < len; i++) {
            var temp = array[i];
            for (var j = i; j >= gap && temp < array[j - gap]; j -= gap) {
                array[j] = array[j - gap];
            }
            array[j] = temp;
        }
    }
}
  • 分析
    • 一開始「增量」較大,每一組的元素較少,排序速度快;隨着「增量」漸減,每一組的元素漸增,但每一組的前面大多元素基本有序,因此排序的速度仍然很快
    • 雖然直接插入排序是穩定的,但因爲分了組,相同的元素可能在各自的分組排序中移動,因此希爾排序是不穩定的
    • 「希爾增量」序列並非最優的增量序列
    • 還有「Hibbard增量」序列、「Knuth增量」序列、「Sedgewick增量」序列...
    • 以上表格中希爾排序的數據是本博客中的採用「希爾增量」的希爾排序的時間複雜度,但這個數據爲百度搜索獲得,具體計算不太清楚,真實性也沒法肯定
相關文章
相關標籤/搜索