在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
生活随笔
收集整理的這篇文章主要介紹了
在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獨白:
希爾排序是經過優化的插入排序算法,之前所學的排序在空間上都是使用列表本身。而歸并排序是利用增加新的空間,來換取時間復雜度的減少。這倆者理念完全不一樣,注定造成的所消耗的時間不同以及空間上的不同。
歸并排序涉及到遞歸的使用,需要理解其中精髓才能更好了解歸并排序,以及其他應用到遞歸的算法。理解其本質才能更好的應用。
?
?
希爾排序
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell于1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
時間復雜度
- 最優時間復雜度:根據步長序列的不同而不同
- 最壞時間復雜度:O(n2)
- 穩定想:不穩定
?
""" 希爾排序 最優時間復雜度: 根據步長序列不同而不同 最壞時間復雜度: O(n*n) 穩定性 : 不穩定 """import time import randomdef shell_sort(list):n = len(list)#初始步長gap = n // 2while gap > 0:# 按初始步長進行插入排序for j in range(gap, n):i = j# 插入排序while i >= gap and list[i-gap] > list[i]:list[i-gap], list[i] = list[i], list[i-gap]i -= gap# 得到新的步長gap = gap // 2def new_num(lis):"""隨機生成50個數加入列表中"""for i in range(50):j = random.randint(0, 10000)lis.append(j)if __name__ == '__main__':first_time = time.time()# 空列表lis = [54,26,93,17,77,31]# 隨機函數添加到列表中# new_num(lis)print(lis)# 列表排序 shell_sort(lis)print(lis)# 結束時間last_time = time.time()print("共用時%s" % (last_time - first_time))?
歸并排序
歸并排序是采用分治法的一個非常典型的應用。歸并排序的思想就是先遞歸分解數組,再合并數組。
將數組分解最小之后,然后合并兩個有序數組,基本思路是比較兩個數組的最前面的數,誰小就先取誰,取了后相應的指針就往后移一位。然后再比較,直至一個數組為空,最后把另一個數組的剩余部分復制過來即可。
時間復雜度
- 最優時間復雜度:O(nlogn)
- 最壞時間復雜度:O(nlogn)
- 穩定性:穩定
?
轉載于:https://www.cnblogs.com/Dreamxin/p/7896313.html
總結
以上是生活随笔為你收集整理的在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P2616 [USACO10JAN
- 下一篇: sell02 展现层编写