Javascript算法——希爾排序

常見的內部排序算法有:插入排序、希爾排序、 選擇排序、冒泡排序、 歸併排序快速排序、堆排序、基數排序等。這裏主要介紹 希爾排序

一圖勝千言:算法

圖片描述

1. 算法介紹

1.1 算法描述

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序算法。
希爾排序是基於插入排序的如下兩點性質而提出改進方法的:shell

  • 插入排序在對幾乎已經排好序的數據操做時,效率高,便可以達到線性排序的效率;
  • 但插入排序通常來講是低效的,由於插入排序每次只能將數據移動一位;

希爾排序的基本思想是:先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行依次直接插入排序。segmentfault

圖片描述

1.2 算法步驟

  • 選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
  • 按增量序列個數 k,對序列進行 k 趟排序;
  • 每趟排序,根據對應的增量 ti,將待排序列分割成若干長度爲 m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲 1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長度。

1.3 算法實現

function shellSort(arr) {
    var len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //動態定義間隔序列
        gap = gap*3+1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = arr[i];
            for (var j = i-gap; j >= 0 && arr[j] > temp; j -= gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}
相關文章
相關標籤/搜索