記錄學習點滴,菜鳥成長記算法
歸併排序的英文叫作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)
5.更新
無