八大排序演算法之希爾排序

2022-09-15 09:36:13 字數 2102 閱讀 6881

描述

設計思想:

把記錄按步長

分組,對每組記錄採用直接插入排序方法進行排序。

隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到1時,整個資料合成為一組,構成一組有序記錄,則完成排序。

圖示

分析

初始時,有乙個大小為 10 的無序序列。

第一趟排序中,我們不妨設 gap1 = n / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。

接下來,按照直接插入排序的方法對每個組進行排序。

第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。

按照直接插入排序的方法對每個組進行排序。

第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。

按照直接插入排序的方法對每個組進行排序。此時,排序已經結束

需要注意一下的是,圖中有兩個相等數值的元素55。我們可以清楚的看到,在排序過程中,兩個元素位置交換了

所以,希爾排序是不穩定的演算法。

**實現

def

get_number(num):

import

random

lst =

i =0

while i

i += 1

return

lstdef

shellsort(lst):

count =len(lst)

step = 2 #

起始步長

group = count // step #

根據步長進行分組排序

while group >0:

for i in

range(0,group):

j = i +group

while j

k = j -group

key =lst[j]

while k >=0:

if lst[k] >key:

lst[k+group] =lst[k]

lst[k] =key

k -=group

j +=group

group //= step #

取整數部分

return

lsta = get_number(10)

print("

排序之前:

",a)

b =shellsort(a)

print("

排序之後:

",b)

####輸出結果#########

排序之前: [71, 34, 15, 66, 36, 40, 2, 58, 33, 77]

排序之後: [2, 15, 33, 34, 36, 40, 58, 66, 71, 77]

效能分析演算法穩定性:由上文的希爾排序演算法演示圖即可知,希爾排序中相等資料可能會交換位置,所以希爾排序是不穩定的演算法。

平均時間複雜度:o(nlog2n)

空間複雜度:o(1)

排序效果

八大排序演算法 希爾排序

希爾的定義 希爾排序是插入演算法的一種,也叫縮小增量排序。是直接插入排序演算法的一種改良版。希爾演算法是把資料序列按下標的一定增量分組,對每組使用直接插入排序演算法進行排序 然後依次縮減增量再進行排序,待整個序列中的元素基本 注 沒有全部完成排序 有序時,再對全體元素進行一次直接插入排序。基本思想 ...

八大排序之希爾排序

package com.eight.paixu 希爾排序法 希爾排序 shellsorting 又稱為 縮小增量排序 該方法的基本思想是 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接...

八大排序之希爾排序

學希爾排序之前,必須要有插入排序演算法的基礎 插入排序演算法 八大排序之插入排序 可以這麼說,希爾排序就是對插入排序的優化 為什麼這麼說呢?場景 2,3,4,5,6 1 現在輪到把 1 插入到正確的位置上,很明顯肯定是插在第一位,即 1 2 3 4 5 6,但是可以看出要比較5次,雖然5次並不多,但...