經典排序演算法:希爾排序(Shell Sort)
希爾排序 希爾排序是Shell在1959年提出的一種排序演算法,它出現的重要意義在於,之前的排序演算法基本都是O(n²),希爾演算法是突破這個時間複雜度的第一批演算法之一,所以它絕對值得我們瞭解掌握!
希爾排序的基本思想是: 把記錄按increment(增量)分組,對每組記錄採用直接插入排序方法進行排序。 隨著增量逐漸減小,所分成的組包含的記錄越來越多,當增量的值減小到 1 時,整個資料合成為一組,構成一組有序記錄,則完成排序。
案例分析 假設我們要對一個數組進行希爾排序
分析:
第一輪:我們設定增量increment = 9/3+1,注意第6步,還要跟第一位相比較,結果為:2,1,4,6,3,7,5,8,9 第二輪:增量為縮小為2,距離為2的元素分為一組,結果為:2,1,3,6,4,7,5,8,9 第三輪:增量縮小為1,距離為1的元素分為一組,此時的排序已經完成,結果為:1,2,3,4,5,6,7,8,9
具體程式碼
r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } //希爾排序關鍵程式碼 void shellSort(SqList *L){ int i,j; int increment = L->length; do{ increment = increment/3+1; //4 for(i=increment+1;i<=L->length;i++){ if(L->r[i] < L->r[i - increment]){ L->r[0] = L->r[i]; //交換 L->r[i] 和 L->r[i - increment]的位置,這一步很關鍵 for(j = i - increment; j > 0 && L->r[0] < L->r[j]; j-=increment){ L->r[j+increment] = L->r[j]; } L->r[j+increment] = L->r[0]; } } }while(increment > 1); } //初始化陣列 void initSort(SqList *L){ L->length = MAXSIZE; L->r[0] = 0; int a[9] = {9,1,5,8,3,7,4,6,2} ; for(int i = 1; i<MAXSIZE; i++){ L->r[i] = a[i-1]; } } //查詢陣列 void searchSort(SqList *L){ for(int i = 1; i < MAXSIZE; i++){ printf("%d", L->r[i]); } }
int main(){ SqList *L = new SqList; initSort(L); searchSort(L); printf("\n"); shellSort(L); searchSort(L); return 0; }
結果如下: