写在前面:
最近从头开始学习算法导论,作为一个非计算机专业的学生,我的目的也就是为了找工作的时候能多点筹码;但是学习过程中还是有不少收获的,顺便也能练习下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必须得单写一个