希爾排序時(shí)插入排序的一種,是直接插入排序算法的一種更高效的改進(jìn)版本。該方法因 D.L.Shell 于 1959 年提出而得名。
希爾排序是基于插入排序而改進(jìn)的:
- 插入排序?qū)缀跻呀?jīng)排好序的數(shù)據(jù)操作時(shí),效率高,即可達(dá)到線性排序的效率。
- 插入排序一般來(lái)說(shuō)是低效的,因?yàn)椴迦肱判蛑荒軐?shù)據(jù)移動(dòng)一位。
基本思想
先取一個(gè)小于 n 的整數(shù) d1 作為第一個(gè)增量,把文件的全部記錄分組。所有距離為 d1 的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序
直至所取的增量dt = 1(<…<d2<d1)
即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?/p>
一般的初次取序列的一半為增量,以后每次減半,直到增量為1。
穩(wěn)定性
由于多次插入排序,我們知道一次插入排序是穩(wěn)定的,不會(huì)改變相同元素的相對(duì)順序,但在不同的插入排序過(guò)程中,相同的元素可能在各自的插入排序中移動(dòng),最后其穩(wěn)定性就會(huì)被打亂,所以 shell 排序是不穩(wěn)定的。
希爾分析
希爾排序是按照不同步長(zhǎng)對(duì)元素進(jìn)行插入排序,當(dāng)剛開始元素很無(wú)序的時(shí)候,步長(zhǎng)最大,所以插入排序的元素個(gè)數(shù)很少,速度很快;當(dāng)元素基本有序了,步長(zhǎng)很小,插入排序?qū)τ谟行虻男蛄行屎芨摺K裕柵判虻臅r(shí)間復(fù)雜度會(huì)比o(n^2)好一些。
def Shell_sort(L):
# 引用至:https://www.cnblogs.com/xubing-613/p/7286203.html
step = len(L)/2
while step > 0:
for i in range(step,len(L)): #在索引為step到len(L)上,比較L[i]和L[i-step]的大小
while(i >= step and L[i] < L[i-step]): #這里可以調(diào)整step從小到大或者從大到小排列
L[i],L[i-step] = L[i-step],L[i]
i -= step
# print L
step /= 2
print L
運(yùn)行結(jié)果.png
我自己畫了個(gè)圖,給自己看
過(guò)程.png