目录
1.基本思想
- 归并排序是利用分治策略实现的
- 分阶段:将问题分成一些小的问题递归求解
- 治阶段:将分阶段得到的子问题的解合并在一起
- 使用分治策略的三个步骤分析归并排序:
- 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列(只是分解,并未做任何处理)
- 解决:递归地排序两个子序列
- 合并:合并两个已排序的子序列为一个排好序的的序列
2.图解原理
合并过程:
再来看看上述的治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤:
3.代码实现
归并排序我们采用递归去实现,也可采用迭代的方式去实现
3.1 递归实现(自定向下的实现)
public class MergeSort extends Sort{
@Override
public void sort(Comparable[] arr) {
mergeSort(arr,0,arr.length-1);
}
private void mergeSort(Comparable[] arr,int left,int right){
/**
* 递归结束的条件,即right最终是等于left的
*/
if(left >= right) {
return;
}
int middle = (left + right)/2;
//递归分解左边的子数组
mergeSort(arr,left,middle);
//递归分解右边的子数组
mergeSort(arr,middle+1,right);
/**
* 以上递归最终会执行完,最终的子数组均为单个元素(left==right),此时就应该进行合并
*
* 在合并的过程中完成排序处理
*/
//合并子数组
merge(arr,left,middle,right);
}
/**
* 合并方法
*
* 此方法是将子数组arr[left...middle]