归并排序也是分治法一个很好的应用,先递归到最底层,然后从下往上每次两个序列进行归并合起来,是一个由上往下分开,再由下往上合并的过程。
而对于每一次合并操作,对于每一次 merge 的操作过程如下:
1、准备一个额外的数组(help),使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
4、重复步骤3直到某一指针达到序列尾;
5、将另一序列剩下的所有元素直接复制到合并序列尾;
看下面的例子合并过程如下:
1、归并排序的代码实现
public class MergeSort {
public static void mergeProcess(int[] arr){
if(arr == null || arr.length < 1){
return;
}
mergeProcess(arr, 0, arr.length - 1);
}
public static void mergeProcess(int[] arr, int left, int right){
if(left > right){
return;
}
int mid = left + ((right -left) >> 1);
mergeProcess(arr, left, mid);
mergeProcess(arr, mid + 1, right);
if(arr[mid] > arr[mid + 1]){
merge(arr, left, mid, right);
}
}
public static void merge(