用到递归、合并,所以叫归并。
public static int[] data = {3,7,8,0,9,5,4,1,6,2};
/**
* 递归
* @param temp 临时数组
* @param sIndex 开始索引
* @param eIndex 结束索引
*/
private static void recursion(int[] temp, int sIndex, int eIndex){
if(sIndex == eIndex){
return ;
}else{
int oneEnd = (sIndex + eIndex) / 2; //分成2半,不能整除放前面
recursion(temp, sIndex, oneEnd); //前个
recursion(temp, oneEnd + 1, eIndex); //后个
merge(temp, sIndex, oneEnd, eIndex);
}
}
/**
* 合并
* @param temp 临时数组
* @param oneStart 合并的第一个数组开始索引
* @param oneEnd 合并的第一个数组结束索引
* @param twoEnd 合并的第二个数组结束索引
*/
private static void merge(int[] temp, int oneStart, int oneEnd, int twoEnd){
int twoStart = oneEnd + 1; //合并的第二个数组开始索引
int start = oneStart; //记录开始索引,以便放回原数组
int end = twoEnd; //记录结束索引,以便放回原数组
int i = 0; //计数器
while(oneStart <= oneEnd && twoStart <= twoEnd){
if(data[oneStart] < data[twoStart]){
temp[i++] = data[oneStart++];
}else{
temp[i++] = data[twoStart++];
}
}
while(oneStart <= oneEnd){//处理剩余
temp[i++] = data[oneStart++];
}
while(twoStart <= twoEnd){//处理剩余
temp[i++] = data[twoStart++];
}
//放回原数组
for(int j = start; j <= end; j++){
data[j] = temp[j - start];
}
}
public static void main(String[] args) {
int[] space = new int[data.length];
recursion(space, 0, data.length - 1);
System.out.println(Arrays.toString(data));
}