希爾排序可以說是插入排序的加強版,通過對原始數據進行分組再排序,更高效地完成對數據的排序工作。
1.從插入排序到希爾排序
回顧插入排序的基本知識,插入排序通過不斷將無序的元素插入到已排序的序列中,直到所有的元素都已經插入位置。

插入排序一個很明顯的缺點是插入元素時需要與已經排序的元素進行對比,對比的次數可能會比較多,考慮最壞的情況,如果原始的數組是倒序的,每插入一個元素時都要跟所有已經排好序的元素進行對比,算法的效率很低。
但是如果插入元素時對比的次數較少,能夠大大提高算法的效率,希爾排序就是通過將元素數組划分為若干小組,然后對各個小組進行插入排序來減低元素之間對比的次數,提高排序的效率。
2.希爾排序的執行過程
希爾排序首先選擇一個元素選擇步長將數組划分為若干小組,對各個小組分別進行排序,然后不斷將步長縮小,不斷分組和排序,直到后的步長為1,對所有的元素進行排序,此時,經過前期的排序工作,能夠減少全體元素插入排序的對比次數,大大降低了排序的時間復雜度。
以一個實際的例子說明希爾排序的執行過程:
將數組{13,7,3,8,12,510,2}從小到大進行排序。
第一次分組排序:選擇步長8/2=4,圖下方的數組表示分組情況


第二次排序:選擇步長4/2=2;


第三次分組排序:選擇步長2/2=1;


3.C++源碼
1 void ShellSort(int array[]){ 2 3 int index = sizeof(array)/2; 4 5 int temp=0; 6 7 while(index>=1){ 8 9 for(int i=index;i<length;i++){ 10 11 for(int j=i-index;j>=0;j-=index){ 12 13 if(array[j]>array[j+index]){ 14 15 temp = array[j]; 16 17 array[j] = array[j+index]; 18 19 array[j+index]=temp; 20 21 } 22 23 } 24 25 } 26 27 index = index/2; 28 29 } 30 31 }
