希爾(Shell)排序

2021-04-14 08:42:31 字數 2402 閱讀 9926

希爾(shell)排序

2)平方級時間複雜度,但當然也沒有線性排序演算法的o(n)級的線性時間複雜度,對於大型資料輸入,線性演算法肯定是最佳的選擇,但對於中規模資料而言,希爾排序無疑是最佳的選擇。演算法大師knuth在他的著作《計算機程式設計藝術》給出的希爾排序的平均時間複雜度為o(n

1.3),介於平方級和線性級之間。

如果你知道插入排序,就很容易理解其排序思想,他的做法是:先取乙個整數d

11個組,所有距離為d

1倍數的記錄放在一組中,先在各組內排序;然後取d

­2­­1­重複上述分組和排序工作;直到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...