定义:即将两个有序的数组归并成一个更大的有序数组。归并排序最吸引人的性质是它能够保证任意长度为N的数组排序所需时间和NlogN成正比;他的主要缺点则是它所需的额外空间和N成正比。
原地归并的抽象方法
原地归并:先将前半部分排序,再将后半部分排序,然后再数组中移动元素而不需要使用额外的空间。
该方法先将所有的元素复制到aux[]中,然后再归并回到a[].方法在归并时(第二个for循环)进行4个条件的判断:
左半边用尽(取右半边的元素)、
右半边用尽
(取左半边的元素)、右半边的当前元素小于左半边的当前元素(取右半边的当前元素)以及右半边的当前元素大于灯与左半边的当前元素(取左半边的当前元素)
代码如下:
自顶向下的归并排序
1.定义:基于上述原地归并的抽象实现了另一种递归归并(分治思想)。如果它能够将两个子数组排序,他能够通过归并两个子数组来将整个数组排序。
2.代码如下:
3.对于长度为N的任意数组,自顶向下的归并需要0.5NlgN至NlgN次比较。
归并排序所需的时间和NlgN成正比,可以用归并排序处理更大规模的数组这是插入或者选择排序做不到的,归并的主要缺点是辅助数组所使用的额外空间和N大小成正比。
自底向上的归并排序
自底向上的归并排序会多次遍历整个数组,根据子数组大小进行两两归并。子数组大小n的初始值为1,每次加倍。最后一个子数组大小的偶数倍为数组大小。
代码如下:
自底向上和自顶向上所用的比较次数和数组访问次数是相同的,只是顺序不同。自底向上比较适合用链表组织的数据。
归并排序在最坏情况下的比较次数和任意基于比较的排序算法所需的最少比较次数都是~NlgN