描述
設計思想:
把記錄按步長
分組,對每組記錄採用直接插入排序方法進行排序。
隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到1時,整個資料合成為一組,構成一組有序記錄,則完成排序。
圖示
分析
初始時,有乙個大小為 10 的無序序列。
在第一趟排序中,我們不妨設 gap1 = n / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。
接下來,按照直接插入排序的方法對每個組進行排序。
在第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。
按照直接插入排序的方法對每個組進行排序。
在第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。
按照直接插入排序的方法對每個組進行排序。此時,排序已經結束。
需要注意一下的是,圖中有兩個相等數值的元素5和5。我們可以清楚的看到,在排序過程中,兩個元素位置交換了。
所以,希爾排序是不穩定的演算法。
**實現
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次並不多,但...