import java.util.Arrays;
/**
* 归并排序
* @author Aobo
*
*/
public class MergeSort {
/**
* 合并数组,比如:
*
* 23456789
* 合并 ^
* |
* 2 6 7 8 3 4 5 9
* 合并 ^ ^
* | |
* 7 8 2 6 3 4 5 9
* @param a 要合并的数组
* @param start 左边开始的下标
* @param middle 右边开始的下标
* @param end 右边结束下标
* @return 返回合并的数组a
*/
public static int[] merge(int[] data,int start,int middle,int end){
// System.out.println("middle=="+middle);
int lengthLeft = middle - start+1; //左数组的长度
int lengthRight = end - middle; //右数组的长度
//多分配一个元素作为哨兵
int[] arrayLeft = new int[lengthLeft+1];
int[] arrayRight = new int[lengthRight+1];
//给左数组赋值
for(int i = 0;i<lengthLeft;i++){
arrayLeft[i] = data[start+i];
}
//给右数组赋值
for(int i = 0;i<lengthRight;i++){
arrayRight[i] = data[middle+1+i];
}
// 最后一个元素哨兵
arrayLeft[lengthLeft] = Integer.MAX_VALUE;
arrayRight[lengthRight] = Integer.MAX_VALUE;
//左右下标
int i = 0;
int j = 0;
for(int k = start;k<=end;k++){
if(arrayLeft[i]<arrayRight[j]){
data[k] = arrayLeft[i];
i++;
}else{
data[k] = arrayRight[j];
j++;
}
}
return data;
}
/**
* 分治排序数组
* @param a 要分治排序的数组
* @param p 左边开始的数组下标
* @param r 右边结束下标
* @return 返回排序好的数组a
*/
public static int[] mergerSort(int[] data,int start, int end){
if(start<end){
int middle = (start+end)/2;
mergerSort(data,start,middle); //拆分数组(左边)
mergerSort(data,middle+1,end); //拆分数组(右边)
merge(data,start,middle,end); //分治法排序数组
System.out.println(Arrays.toString(data));
}
return data;
}
public static void main(String[] args) {
int[] data= new int[]{1,3,11,2,25,6,12,4,5,8,12,7,9,0,13,1,10,12,18};
// int data[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62,
// 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51 };
int middle = (data.length-1)/2;
int[] b = mergerSort(data, 0, data.length-1);
System.out.println(Arrays.toString(data));
System.out.println(data.length);
}
}