日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python算法与数据结构-希尔排序算法

發布時間:2024/9/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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算法与数据结构-希尔排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。