算法导论学习笔记-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必须得单写一个
最后上一些插图:
相关文章推荐
- Unity 捕捉Android按键
- iOS 宏(define)与常量(const)的正确使用
- Oracle所有约束
- appium通过iOS的predicate的模糊或精确匹配使用-ios uiautomation方式寻找元素
- Github——入门笔记
- vim编辑16进制
- Div Article Setion三者的区别
- matlab编译为exe的一些问题
- CODE[VS] 1043 方格取数
- python数据库模块
- 网络netstat awk 分析
- 析构函数中不应该抛出异常(摘录)
- 4月4日高项作业(变更和安全管理)
- css:box-sizing总结
- 【MFC】:MFC如何获得系统时间?
- 言简意赅告诉你KMP算法的原理,不管你信不信,我信了
- LeetCode 63 - Unique Paths II
- bp神经网络及matlab实现
- POJ 3580 OpenJ_Bailian 4090 SuperMemo (伸展树模版)
- tableView 滑动删除