希爾排序是1959 年由d.l.shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。
基本思想:
選擇乙個
增量序列
t1,t2,ti…tj,...,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子串行進行直接插入排序。當增量ti為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
希爾排序的示例:
演算法實現:
我們簡單處理增量序列:增量序列d = n為要排序數的個數
即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。
#include using namespace std;
void print(int a, int n ,int i)
}int main();
shell_sort(a,12); //希爾插入排序
print(a,12,12);
}
希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子中除1 外沒有公因子,且最後乙個增量因子必須為1。希爾排序方法是乙個
不穩定的排序方法。
詳解插入排序之希爾(shell)排序
可以傳入規定排序範圍的引數 low high 進行區域性排序 該程式把首次 步長 設定為需要排序陣列長度的1 2,並又程式自行求出之後的一系列步長 求解規則為下一次步長 上一次步長 2的向上取整 直至最後一次求得步長為1 public static void shellsort t array,in...
插入排序和希爾 Shell 排序
插入排序 陣列前k 1個元素已經有序,如何確定第k個元素的插入位置,使得這k個元素有序。方法1 從左到右掃瞄掃瞄這個有序子陣列,直到遇到第乙個大於等於a k 的元素,然後把a k 插在這個元素的前面。方法2 從右到左掃瞄這個有序子陣列,直到遇到第乙個小於等於a k 的元素,然後把a k 插在這個元素...
插入排序和希爾 Shell 排序
插入排序 陣列前k 1個元素已經有序,如何確定第k個元素的插入位置,使得這k個元素有序。方法1 從左到右掃瞄掃瞄這個有序子陣列,直到遇到第乙個大於等於a k 的元素,然後把a k 插在這個元素的前面。方法2 從右到左掃瞄這個有序子陣列,直到遇到第乙個小於等於a k 的元素,然後把a k 插在這個元素...