标签:
插入排序(Insert Sort)
for j = 2 to A.length
key = A[j]
// Insert A[j] into the sorted sequence A[1...j-1]
i = j - 1;
while i>0 and A[i] > key //until the head of array of find an element less than key
A[i + 1] = A[i] //A[j] stored in key,so you can more A[i] into A[j]
i = i - 1
A[i + 1] = key
该算法时间复杂度为θ(n2)
P与NP
如果问题的时间复杂度可以写成多项式时间复杂度,则为P问题,否则为NP问题。
归并排序(Merge Sort)
归并排序是分治法的运用:将大的问题进行分隔,然后将分别计算,最后将小的结果进行合并
时间复杂度为θ(nlgn)
求最大子数组问题
使用分治法求出左右两边中的最大子数组,以及夸两边(中心点出发两边)的子数组,比较三者大小,得出最大子数组。
矩阵乘法(Strassen算法)
将大型矩阵分解成四个小矩阵,然后在分别计算小矩阵相乘的结果。
当维度不是偶数个数时,可以补零,最后的结果中再去掉
堆排序(Heap Sort)
堆(基于数组的逻辑二叉树)
本身为i,左子节点为2i,右子节点为2i+1,父节点为i/2
父节点的值比子节点的值都大的堆称之为最大堆,最小堆则相反。
使用递归(分治法)将堆初始化为最大堆:
堆排序过程
时间复杂度为nlgn
其特点是速度跟归并排序一样,空间复杂度跟插入排序一样(原址排序),兼备归并排序和插入排序的优点。
快速排序
时间复杂度:nlon
总结:分治法不光可以使用在排序上,还可以使用在对一些大量数据的处理中。因为分治法将大量数据的时间复杂度降低到nlgn以下,既然能够在这么短的时间内进行排序,那么就可以在这么短的时间内(或者差不多的时间内)做完其他的事情。这是分治法对处理数据上带来的新思路。
标签:
原文地址:http://www.cnblogs.com/imhuqiao/p/4926564.html