排序算法系列——歸併排序

記錄學習點滴,菜鳥成長記算法

歸併排序的英文叫作Merge-Sort,要想明白歸併排序算法,還要從「遞歸」的概念談起。數組

1.遞歸app

通常來說,人在作決策行事的時候是每每是從已知出發,好比,我又要舉個不恰當的例子了→_→:學習

  • 看到漂亮姑娘→喜歡人家→追→女友→老婆

可是人家施瓦辛格不是這麼想的,人家從小就立志當總統:this

  • 要當總統←先當州長←競選州長要有錢←那得找個有錢妹子←妹子都喜歡明星←身材好能當明星←健身

遞歸,就像一我的對本身的發展有清晰的規劃和堅決的信心同樣,他知道每一步會有怎麼樣的結果,他須要僅僅是一顆救命稻草,一旦抓住,最終結果是抱住參天大樹。spa

 1 def f(n):#求一個數的階乘
 2     if n==1:
 3         return 1
 4     else:
 5         return n*f(n-1)
 6 def F(willbe):#求我如何成爲天下第一
 7     if willbe == canbe:
 8         return 'be this'
 9     else:
10         return willbe + F(willbe.needbe)
  • 類比於經典的遞歸應用,求一個數的階乘,我寫了一個求我如何成爲天下第一。
  • 遞歸,個人理解就是前世因緣已經註定,要作的就是快速找到前世的因,也就是程序裏的終止條件

最後,我想說的是,要理解遞歸,你先要理解遞歸。這個出自:要理解遞歸,你須要先理解遞歸…….net

2.分治模式:code

分治模式就不談了,通常的分治法就是老生常談的:分解、解決、合併blog

3.歸併排序

下面咱們來解釋什麼是歸併,首先咱們仍是從那副撲克牌提及,你以爲一我的給撲克牌排序沒啥意思,這時你叫上了一個朋友,將撲克牌分紅兩堆,約定各自排各自的,兩人都排好本身的順序後在合併,不一會你兩就排好了。

怎麼合併呢?其實很簡單,大家把兩摞撲克牌放在桌面上,開始比較每一摞最上面的牌,哪張牌最小你就拿起哪張,後拿起的牌放在先前拿起的牌的後面,不一會你兩就將這副牌排好順序了。

而後你以爲這個遊戲頗有意思,你又叫來了2我的,而後你們一塊兒愉快的排撲克牌了;你以爲仍是不夠盡興,因而又叫了50我的,這時每一個人手裏都有一張牌,因爲人太多,不得不併了兩張桌子來讓你們坐下(假設一張桌子能作27我的,沒看過哈利波特嗎,XD...)。。。恩,你們仍是把全部牌放在桌子上,因爲人太多,你就安排了1個桌長,你兩各負責一張桌子;你和小組長以爲仍是管不過來,因而你兩又各自在本身負責區域分了兩個小組長,分下去的小組長也很懶,他們準備繼續行使本身的權力,就這樣分啊分,一共分了54個小組長,你們你看你,我看我。。。

無論了,你只負責你分的兩個小組長,最後你和你認命的桌長一塊兒完成這次艱鉅的任務。

  • 寫到這裏的時候,我想起我當時看過的《三體》,腦海中浮起的是大劉給咱們描述的三體人組成的計算機

4.實現

歸併排序的關鍵是歸併兩個排好序的數組,按照《導論》使用Python實現以下

 1 def Merge(A,p,q,r):
 2     L = A[p-1:q+1-1]#p表示實際的下標,寫完算法再-1
 3     R = A[q+1-1:r+1-1]
 4     temp = []
 5     while len(L) > 0 and len(R) > 0:
 6         if L[0] > R[0]:
 7             temp.append(R.pop(0))
 8         else:
 9             temp.append(L.pop(0))
10     if len(L) > 0:
11         temp.extend(L)
12     if len(R) > 0:
13         temp.extend(R)
14     A[p-1:r+1-1] = temp
15 def MergeSort(A,p,r):
16     if p<r:
17         q = (p+r)/2
18         MergeSort(A,p,q)
19         MergeSort(A,q+1,r)
20         Merge(A,p,q,r)
  • 這裏必須吐槽一下:我是在Eclipse中用PyDev寫的Python程序,盡然沒有變量檢測,因爲輸入中有個r,新建R最初寫的是r,盡然沒有報錯,Debug了一下午才發現,看來仍是心不靜,曾記得看過一句話,說得十分在理,天下程序,惟慢不破。

5.更新

相關文章
相關標籤/搜索