- 基本概念
之前使用自顶向下的归并排序,我们的主要思想是将一个大问题分成一个小问题,通过解决一个一个小问题来最终完成大问题。既然我们可以通过化整为零的方式Coding,那么是不是也可以由简入繁,由下到上?
仔细一想,我们可以先归并小数组,在成对的归并得到的较小数组,通过不断往复循环,归并大的数组。简单来说,就是两两归并,四四归并,八八归并。
- 代码实现
public class MergeSort {
private int[] temp;//初始化一个排序要用的副数组
public static void mergeSort(int[] arr) {
int L = arr.length;//得到参数数组长度L
temp = new int[L];//定义数组长度
for(int x=1; x<L; x = x+x){//定义微型数组的长度,初始为1
for(int y =0; y <L-x; y += x+x) {//定义微型数组的索引
merge(a,temp,0,y+x-1,Math.min(y+x+x-1, L-1);
}
}
}
public static void merge(int[] arr,int[] temp,int min,int mid,int max) {
int i = min;
int j = mid + 1;
for(int x=min;x<=max;x++) {
temp[x]=arr[x];
}
for(int x=min;x<=max;x++){
if(i>mid) {
arr[x] = temp[j++];
}else if(j>max) {
arr[x] = temp[i++];
}else if(temp[i]>temp[j]){
arr[x]=temp[j++];
}else {
arr[x] = temp[i++];
}
}
}
}