归并排序的思想,就是将整段分成两个或多个子部分,然后对子部分继续划分直到不能在划分为止,最后进行合并。
每次将一段分成两部分,也成为二路归并排序
1.具体实现和测试
public class MergeSort {
public static void main(String[] args){
int[] a = {4,3,2,1,6,9,8,0,5,7};
int[] b = new int[a.length];
mergeSort(a,0 , a.length-1);
System.out.println(Arrays.toString(a));
}
private static void mergeSort(int[] arr, int start, int end){
if(start >= end){ //正常结束应该是 相等 如果start>end 应该是错误结束
return;
}else{
int m = (start + end)/2; //除以2表示是二路归并排序
mergeSort(arr, start, m); //对左边进行排序
mergeSort(arr, m+1, end); //对右边进行排序
merge(arr, start, m, end); //将左边和右边进行合并
}
}
/**
* 整合 其实就相当于将两个有序的数组 整合之后仍然有序的过程
* @param arr
* @param start
* @param middle
* @param end
*/
private static void merge(int[] arr, int start, int middle, int end){
int[] temp = new int[end+1]; //生成辅助空间,长度为左右两端合并的总长度
int i = start;
int j = middle + 1;
int k = start; //必须为start,不能为0 为0的话 右边会出错
while(i <= middle && j <= end){
if(arr[i] < arr[j]){
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
}
while(i <= middle){
temp[k++] = arr[i++];
}
while(j <= end){
temp[k++] = arr[j++];
}
for(int index = start; index < k; index++){ //将辅助空间的值赋给原数组 原数组的temp.length部分则成有序
arr[index] = temp[index];
}
}
}
2.测试结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]