資料結構和演算法 排序演算法 希爾排序

2022-05-14 18:13:10 字數 1638 閱讀 8929

##################     希爾排序        #######################

#

"""

希爾排序

希爾排序就是插入排序的一種改進版本,

演算法的步驟

把乙個序列不視為乙個整體,而是視為多個子串行,

假設間隔是gap=4

alist = [54,26,93,17,77,31,44,55,20]

54,26,93,17,77,31,44,55,20

54 77 20 這是1 組,間隔是4,

26 31 這是2 組,間隔是4,

93 44 這是3 組,間隔是4,

17 55 這是4 組,間隔是4,

然後對每一組進行插入演算法的排序,

[54 77 20],認為54是第乙個,然後後面的每乙個去和前面比較,進行插入,--------[20 54 77 ]

全部都排序完成之後,再次合併成為乙個序列,

然後變化間隔, 比如是gap = 2,再次進行插入演算法的排序,

進行之後還是再次合併成為乙個整體序列

再次調整gap,比如gap=1 ,然後再次排序,直到排序完成,

"""

##################     希爾排序        #######################

#

# 第一版:

def shell_sort(alist):

n=len(alist)

gap = n //2

while gap > 0 :

# 這個最外層的迴圈是控制gap的,越來越小,

for j in range(gap,n):

i = j

while i>0:

if alist[i] < alist[i - gap]:

alist[i], alist[i - gap] = alist[i - gap], alist[i]

i -= gap

else:

break

# 縮短gap步長,

gap //=2

# 第二版:

def shell_sort2(alist):

n = len(alist)

# 初始步長

gap = n // 2

while gap > 0:

# 按步長進行插入排序

for i in range(gap, n):

j = i

# 插入排序

while j>=gap and alist[j-gap] > alist[j]:

alist[j-gap], alist[j] = alist[j], alist[j-gap]

j -= gap

# 得到新的步長

gap = gap / 2

if __name__ == '__main__':

alist = [54,26,93,17,77,31,44,55,20]

shell_sort(alist)

print(alist)

資料結構 演算法 希爾排序

希爾排序過程 希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列 步長更長了,列數更少了 來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。def shell sort alist 希爾排序 n len...

資料結構 選擇排序演算法和希爾排序演算法詳解

選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置 下列 是插入排序的內層迴...

資料結構和演算法(三)希爾排序

希爾排序是一種基於插入排序的排序演算法。對於大規模的亂序陣列,插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點從陣列的一端移動到另一端。希爾排序為了加快速度簡單的改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序 希爾排序的思想是使陣列中任意...