在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
獨白:
希爾排序是經(jīng)過優(yōu)化的插入排序算法,之前所學(xué)的排序在空間上都是使用列表本身。而歸并排序是利用增加新的空間,來換取時間復(fù)雜度的減少。這倆者理念完全不一樣,注定造成的所消耗的時間不同以及空間上的不同。
歸并排序涉及到遞歸的使用,需要理解其中精髓才能更好了解歸并排序,以及其他應(yīng)用到遞歸的算法。理解其本質(zhì)才能更好的應(yīng)用。
?
?
希爾排序
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方法因DL.Shell于1959年提出而得名。 希爾排序是把記錄按下標(biāo)的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來越多,當(dāng)增量減至1時,整個文件恰被分成一組,算法便終止。
時間復(fù)雜度
- 最優(yōu)時間復(fù)雜度:根據(jù)步長序列的不同而不同
- 最壞時間復(fù)雜度:O(n2)
- 穩(wěn)定想:不穩(wěn)定
?
""" 希爾排序 最優(yōu)時間復(fù)雜度: 根據(jù)步長序列不同而不同 最壞時間復(fù)雜度: O(n*n) 穩(wěn)定性 : 不穩(wěn)定 """import time import randomdef shell_sort(list):n = len(list)#初始步長gap = n // 2while gap > 0:# 按初始步長進(jìn)行插入排序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個數(shù)加入列表中"""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]# 隨機函數(shù)添加到列表中# new_num(lis)print(lis)# 列表排序 shell_sort(lis)print(lis)# 結(jié)束時間last_time = time.time()print("共用時%s" % (last_time - first_time))?
歸并排序
歸并排序是采用分治法的一個非常典型的應(yīng)用。歸并排序的思想就是先遞歸分解數(shù)組,再合并數(shù)組。
將數(shù)組分解最小之后,然后合并兩個有序數(shù)組,基本思路是比較兩個數(shù)組的最前面的數(shù),誰小就先取誰,取了后相應(yīng)的指針就往后移一位。然后再比較,直至一個數(shù)組為空,最后把另一個數(shù)組的剩余部分復(fù)制過來即可。
時間復(fù)雜度
- 最優(yōu)時間復(fù)雜度:O(nlogn)
- 最壞時間復(fù)雜度:O(nlogn)
- 穩(wěn)定性:穩(wěn)定
?
轉(zhuǎn)載于:https://www.cnblogs.com/Dreamxin/p/7896313.html
總結(jié)
以上是生活随笔為你收集整理的在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P2616 [USACO10JAN
- 下一篇: python 正则的使用 —— 编写一个