1. 程式人生 > 實用技巧 >排序演算法-2-希爾排序

排序演算法-2-希爾排序

一. 基本介紹

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

  • 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率;
  • 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位;

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

二. 演算法步驟

選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列個數 k,對序列進行 k 趟排序;

每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

三. 圖解

四. 原始碼

 1 //arr表示陣列首地址,n表示陣列長度
 2 void shellSort(int *arr, int n) {
 3     int gap, i, j;
 4     for (gap = n / 2; gap > 0; gap /= 2) {
 5         for (i =gap; i <n; i++) {                //
同時比較多個子序列 6 int temp = arr[i]; 7 for (j = i - gap;j>=0 && temp<arr[j];j-=gap) { //選擇排序思路:遍歷子序列中i之前的所有元素,找所屬位置 8 arr[j+gap] = arr[j]; 9 } 10 arr[j + gap] = temp; //因為j-=gap多了一次i 11 } 12 } 13 }