排序算法系列——归并排序

记录学习点滴,菜鸟成长记算法

归并排序的英文叫作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.更新

相关文章
相关标签/搜索