[算法简结]递归分治(二):合并排序
2013-01-19 23:25
239 查看
在上一篇中,我们知道了递归分治的一些理论知识以及一个排列的实现。今天我们继续,讲一个排序:合并排序。
1.合并排序
基本思想就是先将n含有个元素的集合分成n/2个元素的子集合,分别对两个子集合进行合并排序,最后将排好序的子集合合并。我用一张实例图来概括一下。
mergeSortBU
该方法完成子数组大小从小到大的合并,每一次进行的合并都是用循环划分成几个合并操作,即把两个小数组[low...low+size-1]和[low+size...low+size*2 -1](若最后一个数组有这么长的话)合并。
两种排序方法在进行比较和访问数组的次数和顺序会有所不同,关键还是元素个数是不是2的幂。你是希望像mergeSort()一样化整为零的解决方式,还是希望像mergeSortBU()那样循序渐进的解决方法呢?
3.改进
还可以对合并排序进行3项改进:加快小数组的排序速度,检测数组是否已经有序以及通过在递归中狡猾参数来避免数组复制。
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项改进:加快小数组的排序速度,检测数组是否已经有序以及通过在递归中狡猾参数来避免数组复制。
相关文章推荐
- [算法简结]递归分治(三):快速排序
- 数据结构--排序之归并排序(分治 递归 合并典型案例)
- 递归与分治-合并排序、快速排序以及循环赛问题
- Java语言描述:递归与分治策略之合并排序与快速排序
- 合并排序,递归与非递归版本 ,自然全并排序
- 快速排序 : 分治和递归思想
- 合并排序的递归实现算法
- 【数据结构】单链表—合并两个排序链表 — 递归
- [算法简结]递归分治(一):起
- 算法设计与分析 合并排序的递归实现算法
- 分治与递归的结合-------快速排序
- java递归浅析合并排序
- 算法(分治)合并排序和快速排序
- 剑指Offer 面试题25:合并两个排序的链表(递归+非递归) Java代码实现
- 合并两个排序链表--迭代和递归分别实现
- 剑指offer面试题25:合并两个排序的链表(c++ 递归+非递归)
- 【快速排序、合并排序与分治思想】
- litcode 合并两个排序链表 递归求解
- 快速排序-递归与分治
- 递归与分治策略-2.8快速排序