因為上個星期leetcode的一道題(median of two sorted arrays)所以想仔細了解一下歸併排序的實現。
還是先闡述一下排序思路:
首先歸併排序使用了二分法,歸根到底的思想還是分而治之。拿到乙個長陣列,將其不停的分為左邊和右邊兩份,然後以此遞迴分下去。然後再將她們按照兩個有序陣列的樣子合併起來。這樣說起來可能很難理解,於是給出一張我畫的圖。
這裡顯示了歸併排序的第一步,將陣列按照middle進行遞迴拆分,最後分到最細之後再將其使用對兩個有序陣列進行排序的方法對其進行排序。
兩個有序陣列排序的方法則非常簡單,同時對兩個陣列的第乙個位置進行比大小,將小的放入乙個空陣列,然後被放入空陣列的那個位置的指標往後 移乙個,然後繼續和另外乙個陣列的上乙個位置進行比較,以此類推。到最後任何乙個陣列先出棧完,就將另外i乙個陣列裡的所有元素追加到新陣列後面。
由於遞迴拆分的時間複雜度是logn 然而,進行兩個有序陣列排序的方法複雜度是n該演算法的時間複雜度是n*logn 所以是nlogn。
根據這波分析,我們可以看看對上圖的乙個行為。
當最左邊的分到最細之後無法再劃分左右然後開始進行合併。
第一次組合完成[4, 7]的合併
第二次組合完成[4, 7, 8]的合併
第三次組合完成[3, 5]的合併
第四次組合完成[3, 5, 9]的合併
第五次組合完成[3, 4, 5, 7, 8, 9]的合併結束排序。
下面放上python的**
def merge(a, b):
c =
h = j = 0
while j < len(a) and h < len(b):
if a[j] < b[h]:
j += 1
else:
h += 1
if j == len(a):
for i in b[h:]:
else:
for i in a[j:]:
return c
def merge_sort(lists):
if len(lists) <= 1:
return lists
middle = len(lists)/2
left = merge_sort(lists[:middle])
right = merge_sort(lists[middle:])
return merge(left, right)
if __name__ == '__main__':
a = [4, 7, 8, 3, 5, 9]
print merge_sort(a)
python是高階動態程式語言 Python語言
python是一門跨平台 開源 免費的解釋型高階動態程式語言。python支援命令式程式設計 how to do 函式式程式設計 what to do 完全支援物件導向程式設計,擁有大量擴充套件庫。膠水語言 可以把多種不同語言編寫的程式融合到一起實現無縫拼接,更好地發揮不同語言和工具的優勢,滿足不同...
Python程式設計學習第十二課之Python的注釋
當我們編寫的程式 量很大,而且內部邏輯關係非常複雜的時候,閱讀 是非常吃力的。所以我們的程式設計師寧願自己重新寫 也不願意去熟悉別人的 那麼,實際編寫 的過程之中,對 加筆記說明就顯得尤為重要了。在這裡,針對 的筆記被稱為注釋。在之前的幾節課裡面,我們已經不止一次用過注釋了,如下圖所示,以 符號開頭...
python元程式設計運用 深入淺出Python元程式設計
python 官方教程 的開頭是這樣寫的 python 是一門既容易上手又強大的程式語言。這句話本身並無大礙,但需要注意的是,正因為它既好學又好用,所以很多python程式設計師只用到了其強大功能的一小部分。只需要幾個小時,經驗豐富的程式設計師就能學會用 python 寫出實用的程式。然而隨著這最初...