希爾排序能夠說是插入排序的增強版,經過對原始數據進行分組再排序,更高效地完成對數據的排序工做。算法
1.從插入排序到希爾排序數組
回顧插入排序的基本知識,插入排序經過不斷將無序的元素插入到已排序的序列中,直到全部的元素都已經插入位置。spa
插入排序一個很明顯的缺點是插入元素時須要與已經排序的元素進行對比,對比的次數可能會比較多,考慮最壞的狀況,若是原始的數組是倒序的,每插入一個元素時都要跟全部已經排好序的元素進行對比,算法的效率很低。3d
可是若是插入元素時對比的次數較少,可以大大提升算法的效率,希爾排序就是經過將元素數組劃分爲若干小組,而後對各個小組進行插入排序來減低元素之間對比的次數,提升排序的效率。code
2.希爾排序的執行過程blog
希爾排序首先選擇一個元素選擇步長將數組劃分爲若干小組,對各個小組分別進行排序,而後不斷將步長縮小,不斷分組和排序,直到後的步長爲1,對全部的元素進行排序,此時,通過前期的排序工做,可以減小全體元素插入排序的對比次數,大大下降了排序的時間複雜度。排序
以一個實際的例子說明希爾排序的執行過程:源碼
將數組{13,7,3,8,12,510,2}從小到大進行排序。class
第一次分組排序:選擇步長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 }