第二章 2.2归并排序

来源:互联网 发布:手机预算软件 编辑:程序博客网 时间:2024/06/17 06:22
定义

人们根据将两个有序数组归并成一个更大的有序数组。根据此操作发明了简单的递归排序算法:归并排序。
优点:能够保证将任意长度为N的数组排序所需时间和NlogN成正比;
缺点:所需的额外空间和N成正比。


原地归并的抽象方法

创建一个适当大小的数组然后将两个输入数组中的元素一个个从小到大放入这个数组中。
注意:这两个数组要个数一样,并且要都是有序的



自顶向下的归并排序

 基于原地归并的抽象实现了另一种递归归并,这要是应用高效算法设计中分治思想的最典型的例子。这段递归代码是归纳证明算法能够正确地将数组排序的基础:如果它能将两个子数组排序,它就能够通过归并两个子数组来将整个数组排序。

自顶向下的比较次数为什么要是N;

自底向上的归并排序

递归实现的归并排序是算法设计中分治思想的典型应用。

自顶向下的归并排序:我们利用递归将一个大问题一点一点的分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。尽管我们考虑的问题是归并两个大数组,是加上我们归并的数组大多数非常小。
自底向上的归并排序:是先归并那些微型数组,然后再成对归并得到的子数组,如此这般,直达我们将整个数组归并在一起,需要注意的是在每一轮归并中,最后一次归并的第二个子数组可能比第一个子数组要小,如果不是的话,所有的归并中两个数组大小都应该一样。

2.2.4  排序算法的复杂度
      学习归并排序的一个重要原因是它是证明计算复杂性领域的一个重要结论的基础,而计算复杂性能够帮助我们理解排序自身固有的难易程度。计算复杂性在算法设计中扮演着非常重要的角色。
  
      研究复杂度的第一步是建立一个计算模型。一般来说,研究者会尽量寻找一个和问题相关的最简单模型。对排序来说,我们的研究对象是基于比较的算法,它们对于数组元素的操作方式是由主键比较决定的。一个基于比较的算法在两次比较之间可能会进行任意规模的计算,但它只能通过主键之间的比较得到某个主键的信息。因为我们局限于实现了Comparable 接口的对象。

命题1. 没有任何基于比价的算法能够保证少于lg(N!) ~ NlgN 次比较将长度为N的数组排序。
证明:首先,假设没有重复的主键,因为任何排序算法都必须能够处理这种情况。我们使用二叉树来表示所有的比较。树中的结点要么是一片叶子