python算法与数据结构-希尔排序算法
生活随笔
收集整理的這篇文章主要介紹了
python算法与数据结构-希尔排序算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
希爾排序(shell sort)是插入排序的一種,也稱縮小增量排序,與普通的插入算法的區別就是gap步長。
希爾排序內層循環邏輯如下所示:
上面的可以分為4組,一個一個的按照插入算法來做,第一組有54 77 20三個元素,第二組是26 31兩個元素,第三組是93和44兩個元素,第四組是17和55兩個元素。上面的可以分為4組,一個一個的按照插入算法來做,第一組有54 77 20三個元素,第二組是26 31兩個元素,第三組是93和44兩個元素,第四組是17和55兩個元素。
上面的按照插入算法交換后較小的數在前面,較大的數在后面。
當gap=1的時候再次執行插入算法,如下所示:
希爾排序外層循環如下所示:
代碼如下所示:
# coding:utf-8 def shell_sort(alist):"""希爾排序"""n=len(alist)gap = n // 2 #相除,因為涉及到/符號,所以又加了一個斜杠#print(gap) #4#gap變化到0之前,插入算法執行的次數#while gap>0:while gap >= 1:#print('gap值是',gap) #gap值是 4 gap值是 2 gap值是 1#下面的for循環是一個gap的情況,gap需求不斷縮短,所以在外面又套了一層while的gap循環,上面的gap>0也可以寫成gap>=1#插入算法,與普通的插入算法的區別就是gap步長#外層循環for j in range(gap,n):#j=[gap,gap+1,gap+2,gap+3,...,n-1]#print('外層循環值是',j)i = j#print('第一次',j,gap,n) #4 4 9# 先寫內層循環while i>0:if alist[i] < alist[i-gap]:#print(i,gap,i-gap) #6 4 2 2 4 -2 8 4 4# print('666')# print(j,i, gap, i - gap) #6 6 4 2 6 2 4 -2 8 8 4 4 8 4 4 0alist[i],alist[i-gap] = alist[i-gap],alist[i]i-=gapelse:break#break;#break;#縮短gap步長gap //=2#print('gap除以2后的值是', gap) #gap除以2后的值是 2 gap除以2后的值是 1 gap除以2后的值是 0if __name__ == "__main__":li = [54, 26, 93, 17, 77, 31, 44, 55, 20]print(li)shell_sort(li)print(li) """ [54, 26, 93, 17, 77, 31, 44, 55, 20] [17, 20, 26, 31, 44, 54, 55, 77, 93]"""另外一種實現方式如下所示:
# 創建一個希爾排序的函數 def shell_sort(alist):# 需要排序數組的個數N = len(alist)# 最初選取的步長gap = N // 2# 根據每次不同的步長,對分組內的數據進行排序# 如果步長沒有減為1就繼續執行#while gap > 0:while gap >= 1:# 對每個分組進行插入排序,# 因為插入排序從第二個元素開始,而這里第二個元素的下標就是gap# 所以j的起始點是gapfor j in range(gap, N): # 4 2 1這種,j的開始值是4,后來越來越小 2 1# 控制每個分組內相鄰的兩個元素,邏輯上相鄰的兩個元素間距為gap,# i的前一個元素比它少一個gap距離,所以for循環中j的步長為 -gapfor i in range(j, 0, -gap):# 判斷和邏輯上的分組相鄰的兩個數據大小if alist[i] < alist[i - gap] and i - gap >= 0:# 交換temp = alist[i]alist[i] = alist[i - gap]alist[i - gap] = temp# 改變步長gap = gap // 2numlist = [5, 7, 8, 3, 1, 2, 4, 6, 9] print("排序前:%s" % numlist) shell_sort(numlist) print("排序后:%s" % numlist) """ 排序前:[5, 7, 8, 3, 1, 2, 4, 6, 9] 排序后:[1, 2, 3, 4, 5, 6, 7, 8, 9] """總結
以上是生活随笔為你收集整理的python算法与数据结构-希尔排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宫斗群名字大全?群名 好听的宫廷群名字
- 下一篇: linux安装篇之mongodb安装及服