您的位置:首页 > 其它

算法导论学习笔记-1-基础排序算法

2016-04-05 17:12 375 查看

写在前面:

最近从头开始学习算法导论,​作为一个非计算机专业的学生,我的目的也就是为了找工作的时候能多点筹码;但是学习过程中还是有不少收获的,顺便也能练习下python编程水平,因此记录下学习内容

排序算法​种类:

第一章是算法基础,这里介绍了2种排序方法:插入排序和归并排序;例子还算比较浅显易懂。

对于插入排序,可以用一个打牌时接牌的模型来比喻:起初手里没有牌,然后拿到第一张,肯定不需要排序,接着拿到第二张,将其与第一章比较大小,如果小,就放第一张左边。接下去第三张,要与前2张进行比较,并插入合适的位置。

python代码如下:​这里应该是粘帖错了,并不是nlogn





第二种是很简单常见的冒泡排序。代码如下:





第二种是比以上2者都快的归并排序;代码如下:





稍后将给上算法原理及代码详解

新浪博客不能po代码实在太坑爹了

对于归并排序,首先我们假设有2堆已经排序好的数组(纸牌)。那么我们得想个办法将其合并为一个顺序牌。首先将2堆牌正面放置,即每一堆都是上小下大排列。然后比较2张顶牌,取出一张小的,再比较顶牌,。。。直到有一堆牌被完全取光,那么剩下的另一堆肯定都比现有的牌大,而且他也是排序好的,只要将其全部拿过来放在后面即可。

这就是2个有序数组的合并过程。用merge(a,b)函数来表示这个过程

 

接下去就是二分递归策略,我们把待排序数组分成2份,这2份再各自分为2份。。。直到分成的数组中都只包含一个元素,如果这2份有序(显然是有序的,因为只有一个数啊),那么可以调用merge将其合并为一个。这样递归调用,如merge-sort所示。

 

小于10个则采用插入排序,这个是书上的练习题,不是原始归并排序的步骤。总结以下,在递归调用中要注意的几点:

1、分解到最底层时候的操作,如len(a)==1时,往往要单独拿出来操作,否则会无限递归下去

2、相同的操作可以使用递归,不同的操作则要单独写成一个函数,如这里的merge必须得单写一个

 

 最后上一些插图:









 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: