MIT6.006Lec03:插入排序,归并排序,递归树
2013-08-20 19:45
260 查看
MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等。
插入排序,可以分为线性插入排序、二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定。
归并排序,是用分治思想处理,先分别排序,再合并。
递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了。另外有主定理可以使用。
参考了《算法导论》和网络上的资源,以下是我修改后的代码:
插入排序,可以分为线性插入排序、二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历,后者二分,后者更加稳定。
归并排序,是用分治思想处理,先分别排序,再合并。
递归树,我的理解是算法消耗时间T(n)用树状的结构,表示每次递归消耗的时间,这些时间累加就是T(n),而递归树的每一行和相邻行之间的关系也是比较容易观察的,这就容易写出时间复杂度的表达式了。另外有主定理可以使用。
参考了《算法导论》和网络上的资源,以下是我修改后的代码:
#coding:utf8 #插入排序 版本1(线性插入排序) def insertion_sort1(a): for j in range(1, len(a)): key = a[j] i = j - 1 while i>=0 and a[i]>key: a[i+1] = a[i] i = i-1 a[i+1] = key if __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 - 1 if key > a[i]: continue l, r = 0, i while l <= r: #print l, r mid = (l + r) / 2 if key < a[mid]: r = mid - 1 else: l = mid + 1 k = j while k > l: a[k] = a[k - 1] k = k - 1 a[l] = key if __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 Lec03 def merge_sort(a, l, r): '''归并排序主程序''' if l < r: m = (l + r) / 2 merge_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, l while i<len1 and j < len2: if left[i] < right[j]: a[k] = left[i] i = i + 1 else: a[k] = right[j] j = j + 1 k += 1 while i<len1: a[k] = left[i] k += 1 i += 1 while j<len2: a[k] = right[j] k += 1 j += 1 if __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
相关文章推荐
- 插入排序,希尔排序,归并排序
- 排序:插入,希尔,堆,快速,归并排序
- 算法导论:插入排序和归并排序
- 插入排序及归并排序
- 链表插入排序、链表归并排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 比较排序之插入和归并排序
- 算法导论第二章总结:插入排序、归并排序
- 插入排序、选择排序,冒泡排序、归并排序——(个人笔记)
- 排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- python中实现二分查找,插入排序,归并排序,快速排序
- c++ 模板实现 -- 直接插入排序和归并排序
- 数据结构直接插入排序——归并排序
- java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)
- C/C++排序之二(直接插入排序、 折半插入排序、归并排序(递归))
- 插入排序与归并排序
- 排序大全【各种排序】:直接插入,折半插入,冒泡,快排,简单选择,堆排序,归并排序
- C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
- 插入排序、归并排序和递归算法的复杂性分析