希爾排序:
也稱縮小增量排序,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。
希爾排序的基本思想:
1、先將整個待排序列分割成若干個子串行(由相隔某個「增量」的元素組成)分別進行直接插入排序;
2、然後依次縮減增量再進行排序;
3、待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
4、因直接插入排序在元素基本有序的情況下(接近最好情況)效率很高,所以希爾排序在時間效率上比插入排序有較大提高。
希爾排序的時間複雜度大致介於o(n)和o(n²)之間。如果使用某些間隔時,它的時間複雜度為o(n²)。通過改變間隔的大小,比如以2k-1(1,3,5,7,15,31等等)為間隔,希爾排序的時間複雜度可以達到o(n**1.5)。
示例:
# 希爾排序
def shellsort(alist):
sublistcount = len(alist) // 2 #初始子串行數,每2個元素為乙個子串行
while sublistcount > 0: #增量》0則迴圈
for startposition in range(sublistcount): #將所有子串行進行迴圈插入排序
# 將子串行以子串行數作為增量進行插入排序
gapinsertionsort(alist, startposition, sublistcount)
print("在間隔為", sublistcount, "的增量之後,列表為:", alist)
sublistcount = sublistcount // 2 #縮減增量及子串行數繼續迴圈
# 增量插入排序,gap為增量
def gapinsertionsort(alist, start, gap):
m = start + gap #迴圈開始位置
n = len(alist) #迴圈結束後乙個位置
for i in range(m, n, gap):
currentvalue = alist[i] #將當前值賦值給待插入元素
position = i #將當前索引賦值給position
# 當待插入元素的位置》=增量且子串行中前乙個元素比待插入元素大,則迴圈
while position >= gap and alist[position - gap] > currentvalue:
alist[position] = alist[position - gap] #將子串行中前乙個元素移到待插入元素位置
position -= gap #將待插入元素位置前移增量值個位置
alist[position] = currentvalue #將待插入元素賦值到正確位置
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shellsort(alist)
print(alist)
結果為:
在間隔為 4 的增量之後,列表為: [20, 26, 44, 17, 54, 31, 93, 55, 77]
在間隔為 2 的增量之後,列表為: [20, 17, 44, 26, 54, 31, 77, 55, 93]
在間隔為 1 的增量之後,列表為: [17, 20, 26, 31, 44, 54, 55, 77, 93]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
排序演算法之python希爾排序
希爾 shell 排序是一種插入排序,同時也叫縮小增量排序,算是直接插入排序的乙個優化演算法,以其設計者希爾 donald shell 的名字命名,該演算法由 1959 年公布。將待排序列以一定的步長分成子串行,把子序列進行排序,然後會繼續以更小的步長進行分子序列,並將子串行排序,最終演算法以步長為...
排序之希爾排序
提到希爾排序,我們得先來看看插入排序,因為希爾排序本身就是對插入排序的一種優化。插入排序的基本思想 每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,直到元素全部插完為止。就像我們玩鬥地主一樣,接牌的時候,其實就是一種插入排序,每接一張牌,就會把牌放在自己手牌...
排序之希爾排序
希爾排序法又稱縮小增量法。基本思想 先選定乙個整數,把待排序檔案中所有元素分成個n組。所有元素為n的記錄分在同一組內,並對每一組內的記錄進行排序。取重複上述分組和排序的工作。當到達 1時,所有元素在統一組內排好序。實現 void insertsortwithgap int a,int size,in...