归并排序
本文中的大多数代码以及描述,都来自于《算法(第4版)》这本书,加上自己的一些分析与理解。
- 基本描述
归并排序是将一个数组拆分成两半分别排序,然后把两个已经排好序的结果归并起来。它有两种基本的实现,一种是自顶向下,这种需要递归,从上到下,不断拆分,把拆分的结果进行归并。另外一种是自底向上,先从最底层按照每两个元素进行归并,再分别按照4,8,16…个一层层向上归并,直到把整个数组归并。 - 基本的归并算法
归并算法就是把两个有序的数组进行归并(merge)。就是从两个数组的左边开始取值,哪个小就取哪一个,每取出一个值,放到新数组的最左侧。这个代码如下:
/**
* 原地归并算法,从小到大的顺序
* 这个是把第一个数组a[lo]~a[mid]
* 与第二个数组a[mid+1]~a[hi]
* 两个有序的数组,归并到一块儿。
* @param a 需要归并的数组
* @param lo 第一个数组的起始索引
* @param mid 第一个数组的结束索引
* @param hi 第二个数组的结束索引
* @param temp 缓存数组,大小需要和a数组一样
*/
public void merge(Comparable<?>[] a,int lo,int mid,int hi,Comparable<?>[] temp) {
int i=lo;
int j=mid+1;
for (int k = lo; k <= hi; k++) {
temp[k]=a[k];
}
for (int k &