經典排序之插入排序(希爾排序)

2021-10-24 22:54:48 字數 1536 閱讀 9029

加深自己對經典排序演算法的理解,並且探索更多簡化的寫法和優化的表現。

1. 插入排序,一般也被稱為直接插入排序。對於少量元素的排序,它是乙個有效的演算法。插入排序是一種最簡單的排序方法,它的基本思想是將乙個記錄插入到已經排好序的有序表中,從而乙個新的、記錄數增1的有序表。在其實現過程使用雙層迴圈,外層迴圈對除了第乙個元素之外的所有元素,內層迴圈對當前元素前面有序表進行待插入位置查詢,並進行移動 。

2. 希爾排序(shell's sort)是插入排序的一種又稱「縮小增量排序」(diminishing increment sort),是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因 d.l.shell 於 1959 年提出而得名。

def insert_sort(random_list: list) -> list:

"""插入排序 保證前面的佇列是乙個有序的 每次從後面找乙個插入到有序的裡面去 當後面的數比前面小才需要進行插入 否則跳過當前數

:param random_list:

:return:

"""length = len(random_list)

if length <= 1:

return random_list

for i in range(1, length):

for j in range(i,0,-1):

if random_list[j-1] > random_list[j]:

random_list[j-1], random_list[j] = random_list[j], random_list[j-1]

else:

break

return random_list

def shell_sort(random_list: list) -> list:

"""希爾排序 插入排序的優化 按照步長進行多次插入排序 每次把步長縮短一半 直到步長為1

:param random_list:

:return:

"""length = len(random_list)

if length <= 1:

return random_list

gap = length//2

while gap > 0:

for i in range(gap, length):

for j in range(i, 0, -gap):

if random_list[j-gap] > random_list[j]:

random_list[j], random_list[j-gap] = random_list[j-gap], random_list[j]

if gap == 1:

break

gap = gap//2

return random_list

插入排序的方法很容易理解,依次將未排序的插入到已排序的列表中,而希爾排序則是巨集觀上對插入排序進行多次調控後,最後再按照插入排序進行排序,這樣看起來操作次數增加了,但是減少了在插入的時候尋找到合適位置的次數,因此演算法效率得到了提公升。

插入排序之希爾排序

希爾排序也屬於插入類排序演算法。希爾排序通過縮小增量,將待排序元素劃分為若干個子串行,分別對各個子串行按照直接按照插入排序演算法進行排序。當增量為1時,待排序元素構成乙個子串行,對該序列排序完畢後希爾排序演算法結束。如下 include void shellsort int a,int length...

插入排序之希爾排序

直接插入排序與希爾排序相比還是有一些問題的。結論 當需要插入的數是比較小的數時,後移的次數明顯增多,對效率有影響。1 交換法 test public void testsort long start system.currenttimemillis bubblesorting array 氣泡排序排...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...