MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等。

插入排序,可以分为线性插入排序、二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定。

归并排序,是用分治思想处理,先分别排序,再合并。

递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了。另外有主定理可以使用。

参考了《算法导论》和网络上的资源,以下是我修改后的代码:

#coding:utf8
#插入排序 版本1(线性插入排序)def insertion_sort1(a):for j in range(1, len(a)):key = a[j]i = j - 1while i>=0 and a[i]>key:a[i+1] = a[i]i = i-1a[i+1] = keyif __name__ == '__main__':array = [2,2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3, 2]insertion_sort1(array)for a in array:print a

  

# coding:utf8# 插入排序 版本2(二分插入排序)def binInsertSort(a):n = len(a)for j in range(1, n):key = a[j]i = j - 1if key > a[i]:continuel, r = 0, iwhile l <= r:#print l, rmid = (l + r) / 2if key < a[mid]:r = mid - 1else:l = mid + 1k = jwhile k > l:a[k] = a[k - 1]k = k - 1a[l] = keyif __name__ == '__main__':array = [2, 2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3]insertsort(array)for a in array:print a

  

#coding:utf8
#归并排序
#MIT6.006 Lec03def merge_sort(a, l, r):'''归并排序主程序'''if l < r:m = (l + r) / 2merge_sort(a, l, m)merge_sort(a, m + 1, r)merge(a, l, m, r)def merge(a, l, m, r):'''归并两个有序表'''left = a[l:m+1]right = a[m+1:r+1]len1 = len(left)len2 = len(right)i, j, k = 0, 0, lwhile i<len1 and j < len2:if left[i] < right[j]:a[k] = left[i]i = i + 1else:a[k] = right[j]j = j + 1k += 1while i<len1:a[k] = left[i]k += 1i += 1while j<len2:a[k] = right[j]k += 1j += 1if __name__ == '__main__':array = [2, 2, 4, 32, 64, 34, 78, 23, 2345, 12, 1, 3, 2]merge_sort(array, 0, len(array)-1)for a in array:print a

  

转载于:https://www.cnblogs.com/zjutzz/p/3270852.html

MIT6.006Lec03:插入排序,归并排序,递归树相关推荐

  1. 数据结构与算法之美笔记——基础篇(中):树,二叉树,二叉查找树,平衡二叉查找树,红黑树,递归树,堆

    树: A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点.B.C.D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点.我们把没有父节点的节点叫作根节点,也就是图中的节点 E.我们 ...

  2. [数据结构]递归树:借助树求解递归算法的时间复杂度

    文章目录 递归树与时间复杂度分析 实战一:分析快速排序的时间复杂度 实战二:分析斐波那契数列的时间复杂度 实战三:待补充,先学其他的... 递归树与时间复杂度分析 我们前面讲过,递归的思想就是,将大问 ...

  3. 算法学习笔记16:递归树

    递归树:如何借助树来求解递归算法的时间复杂度 今天,我们来讲这种数据结构的一种特殊应用,递归树. 我们都知道,递归代码的时间复杂度分析起来很麻烦.我们在<排序>那里讲过,如何利用递推公式, ...

  4. 27 | 递归树:如何借助树来求解递归算法的时间复杂度?

    目的 借助递归树来分析递归算法的时间复杂度 递归树 递归的思想就是将大问题分解为小问题来求解,然后再将小问题分解为小小问题.这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止. ...

  5. 算法:递归(借助递归树来求解分析递归算法的时间复杂度)

    递归代码的时间复杂度分析起来非常麻烦,今天我们尝试来借助递归树分析递归算法的时间复杂度. 1. 递归树与时间复杂度分析 递归的思想就是将大问题一层一层地分解为小问题来求解,如果我们把这个分解过程画成图 ...

  6. 递归方程的求解(代入、递归树和主方法)

    递归方程 递归方程之前提到过,就是部分算法在求解的过程中使用了将一个问题划分成几个等价的小问题,在这个过程中,我们就可以列出一个等式. (如归并排序中,将一个大数组拆分成两个小数组分别计算,然后用O( ...

  7. 用递归树求解递归算法时间复杂度

    文章内容.图片均来自极客时间. 递归代码复杂度分析起来比较麻烦.一般来说有两种分析方法:递推公式和递归树. 1 递推公式法 归并排序的递推公式是: merge_sort(p-r) = merge(me ...

  8. 递归树-分析时间复杂度

    递归的思想就是把一个大问题分解为小问题,再把小问题继续分解下去,一直到无法再分为止.所以递归的核心思路就是找到递归公式和终止条件.那么什么是递归树?简单来说,这颗树是由递归的子问题组成树,树的节点就是 ...

  9. 递归树: 如何借助树来求解递归算法的时间复杂度

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 今天,来讲树这种数据结构的一种特殊的应用,递归树. 我们都知道,递归代码的时间复杂度分析起来很麻烦 ...

  10. 递归树——分析递归算法的时间复杂度

    递归树 递归的思想就是,将大问题分解为小问题来求解,然后再将小问题分解为小小问题. 这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止. 如果我们把这个一层一层的分解过程画成图 ...

最新文章

  1. 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )
  2. 吃下去的东西老是往上翻上来_这间日日火爆的面馆,当年海藻带宋思明吃过
  3. 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
  4. linear-gradient线性渐变
  5. 学习nodejs+express+angular+socket.io ,投票demo
  6. mysqlbinlog日志查看
  7. template 的简单使用
  8. PHP实现9x9乘法表
  9. WebHeaderCollection 类
  10. oracle 泵备份,Oracle逻辑备份之数据泵(一)
  11. 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS
  12. 火狐扩展教程_5个Firefox扩展保护您的隐私
  13. 苹果悬浮球_手机轻松实现多个系统!安卓手机运行苹果iOS系统?期待!
  14. 【STM32H7的DSP教程】第17章 DSP功能函数-定点数互转
  15. redmibook pro 14 arch linux alsamixer 检测不到声卡
  16. [Windows]Win10/Win11切换专业工作站版本
  17. excel冻结窗口怎么设置_说说Word和Excel表头共享,全部方法供你选择
  18. Ubuntu 安装 nvm
  19. Android app本地图片转换成Drawable对象的方法
  20. 安装配置Android Studio集成开发环境

热门文章

  1. Mac vscode花屏问题解决
  2. idea集成testng_idea安装testng插件后,无法使用调用testng里面的类
  3. 安装Linux虚拟机(一)
  4. Pandas系列(十二)实现groupby分组统计
  5. 机器博弈 (四)博弈规则的设计
  6. Blender Reference Manual 欢迎使用Blender手册!
  7. 一个计算机高手的成长zz
  8. mysql int类型 int(11) 和int(2)区别
  9. java中关于日期类Calendar的简单使用
  10. 编程时遇到问题的解决方向