您的位置:首页 > 其它

[算法简结]递归分治(二):合并排序

2013-01-19 23:25 239 查看
在上一篇中,我们知道了递归分治的一些理论知识以及一个排列的实现。今天我们继续,讲一个排序:合并排序。

1.合并排序

基本思想就是先将n含有个元素的集合分成n/2个元素的子集合,分别对两个子集合进行合并排序,最后将排好序的子集合合并。我用一张实例图来概括一下。

mergeSortBU

public static <E extends Comparable> void mergeSortBU(E[] list)
{
int n = list.length;

tmp = new Comparable
;

for(int size = 1; size < n; size = size + size) //size为子数组的大小,逐渐变大
{
for(int low = 0; low < n - size; low += size * 2) //low为子数组的索引,即每两个子数组的第一个元素下标
{
merge(list, low, low + size - 1, Math.min(low + size * 2 - 1, n - 1)); //将两个小数组合并成大小为size*2的数组
}
}
}


该方法完成子数组大小从小到大的合并,每一次进行的合并都是用循环划分成几个合并操作,即把两个小数组[low...low+size-1]和[low+size...low+size*2 -1](若最后一个数组有这么长的话)合并。

两种排序方法在进行比较和访问数组的次数和顺序会有所不同,关键还是元素个数是不是2的幂。你是希望像mergeSort()一样化整为零的解决方式,还是希望像mergeSortBU()那样循序渐进的解决方法呢?

3.改进

还可以对合并排序进行3项改进:加快小数组的排序速度,检测数组是否已经有序以及通过在递归中狡猾参数来避免数组复制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: