归并排序思路:现先待排序数组划分成两个数组,然后再划分,直至划分后的子数组只有一个元素(一个元素的数组既是有序数组),然后再两两合并(按照顺序合并),最终形成一个完整的有序数组。
所以归并排序核心有两个:两个数组合并排序成一个有序数组;一个数组怎么拆分成N个子数组。
代码实现:
public static void merge(int [] arr) throws Exception{
if(arr == null){
throw new Exception("输入参数有误");
}
int first = 0;
int last = arr.length-1;
merge_1(arr,first,last);
}
//完成数组的拆分
public static void merge_1(int [] arr,int first,int last){
int begin = first;
int mid = (first+last)/2;
int end = last;
if(begin < end ){
merge_1(arr,begin,mid);
merge_1(arr,mid+1,end);
conbineSort(arr,begin,end,mid);
}
}
//完成两个数组合并成一个有序数组
public static void conbineSort(int [] arr,int first,int last,int mid){
int [] p = new int[100];
int i = first;
int j = mid+1;
int k = 0;
while(i <= mid && j <= last){
if(arr[i] > arr[j]){
p[k++] = arr[j++];
}else {
p[k++] = arr[i++];
}
}
while(i <= mid){
p[k++] = arr[i++];
}
while(j <= last){
p[k++] = arr[j++];
}
for(int m = 0 ; m <k ; m++){
arr[first+m] = p[m];
}
}
测试:
public static void main(String[] args) throws Exception {
int [] arr = {5,9,1,3,52,13,2,8,4};
merge(arr);
for(int i : arr){
System.out.println(i);
}
}
参考资料:http://blog.youkuaiyun.com/morewindows/article/details/6678165