希爾(shell)排序
2)平方級時間複雜度,但當然也沒有線性排序演算法的o(n)級的線性時間複雜度,對於大型資料輸入,線性演算法肯定是最佳的選擇,但對於中規模資料而言,希爾排序無疑是最佳的選擇。演算法大師knuth在他的著作《計算機程式設計藝術》給出的希爾排序的平均時間複雜度為o(n
1.3),介於平方級和線性級之間。
如果你知道插入排序,就很容易理解其排序思想,他的做法是:先取乙個整數d
11個組,所有距離為d
1倍數的記錄放在一組中,先在各組內排序;然後取d
21重複上述分組和排序工作;直到d
i=1,即所有記錄放在一組中為止。各組的排序可以採用直接插入法,也可以採用像直接選擇排序或堆排序等其他排序方法。
直接插入排序在輸入序列基本有序時,排序時間較少。另一方面,當n值較小時,n和n
2的差別也較小。shell排序開始時增量較大,分組較多,每組的記錄數目較少,故在各組內採用直接插入排序較快,後來增量d
i‑逐漸縮小,分組數減少,各組的記錄數增多,但由於已經按d
i-1分組排序,序列已經趨於有序態,所以一趟排序過程也較快。因此,shell排序在效率上比直接排序有較大的改進。。
希爾排序的實現:
void shellsort(sortobject * pvector , int d)
if (j != i - increment) pvector->record[ j + increment ] = temp;}}
}希爾排序示例:
初始序列:
49 , 38 , 65 , 97 , 13 , 76 , 27 , 49』
increment=4:
①i = 4 , temp.key = 13 , j = 0,交換49和13:
13 , 38 , 65 , 97 , 49 , 76 , 27 , 49 』
②i = 5 , temp.key = 76 , j = 1,不交換38和76:
13 , 38 , 65 , 97 , 49 , 76 , 27 , 49 』
③ i = 6, temp.key = 27 , j = 2,交換65和27:
13 , 38 , 27 , 97 , 49 , 76 , 65, 49 』
④ i = 7, temp.key = 49 , j = 3,交換97和49
『: 13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97
increment=2:
①i = 2 , temp.key = 27 , j = 0, 不交換13和27:
13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97
②i =3 , temp.key = 49
』, j = 1,不交換38和49
』:13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97
③ i = 4, temp.key = 49 , j = 2,交換65和27:
13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97 』
④ i =5, temp.key = 76 , j = 3,交換97和49
『: 13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97
⑤i = 6, temp.key = 65 , j = 2,交換65和27:
13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97 』
⑥i = 7, temp.key = 97 , j = 3,交換97和49
『: 13 , 38 , 65 ,49
』 , 49 , 76 , 27 , 97
increment = 1:
同插入排序
最後得:
13 , 27 , 38 , 49』 , 49 , 65 , 76 , 97
如果仔細分析演算法的每一步,我們可以看到對於增量劃分的每一組資料,不是將分別對每一組資料進行插入排序,而是從各組交替進行插入排序的,從increment+1下標元素開始順序遍歷至最後乙個元素,對每乙個元素和他前面已成有序態的同一組資料進行插入排序。。
希爾shell排序
include include include typedef int type define n 100000 void exchange type a,int a,int b void selectionsort type a,int n void insertionsort type a,in...
希爾排序 Shell
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序。該方法的基本思想是 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基...
希爾排序 Shell
希爾排序 shell 1.將n個元素array 分成n 2個數字序列,第乙個資料和第n 2 1 個資料為一對,併排好順序 2.分成n 4個序列,再次排序 3.直到序列為一為止 include include include define size 10 void shellsort int a,in...