排序演算法之希爾排序

2021-06-22 16:02:10 字數 963 閱讀 9945

希爾排序,突破了「通過交換相鄰元素進行排序的任何演算法平均需要ω(n^2)」的二次時間限制

通過比較相距一定間隔的元素來工作。使用乙個增量序列:h1=1,h2,...,ht,在使用乙個

增量h的一趟排序後,對於每乙個i滿足pdata[i]<=pdata[i+h],即此時序列是h排序的;各趟

比較所用的距離逐漸減小,直到只比較相鄰元素的最後一趟排序為止。

c++版本,使用希爾增量時,時間複雜度為o(nlogn);使用hibbard增量時大約為o(n^(5/4));使用sedgewick增量時大約為o(n^(4/3))

//希爾增量n/2、n/2^2...,最壞情形n^2;hibbard增量1、3、7...2^k-1,最壞n^(3/2),平均n^(5/4);

//sedgewick提出了集中增量序列,最壞n^(4/3),平均n^(7/6),如:其中的

//項為9*4^i-9*2^i+1,或者是4^i-3*2^i+1

void shellsort(int *pdata, int count) //count/2,count/4...

pdata[j+increment] = temp;

} }

python版本

def shell_sort(lst):

length = len(lst)

incre = int(length/2)

while incre>0:

for i in range(incre,length):

temp = lst[i]

j = i-incre

while j>=0 and lst[j]>temp:

lst[j+incre] = lst[j]

j = j-incre

lst[j+incre] = temp

incre = int(incre/2)

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...

排序演算法之希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...

排序演算法之希爾排序

設待排元素序列有 n 個,首先取乙個整數ga p ga p作為間隔,將全部元素分為ga p 個子序列,所有距離為ga p 的元素放在同乙個子串行中,在每乙個子串行中分別進行直接插入排序。然後縮小間隔ga p 重複上述的子串行劃分和排序工作。知道最後ga p 等於1時,將所有元素放在同乙個序列中排序為...