思想:
将两个(或两个以上)有序表合成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列都是有序的,然后再把有序的子序列合并为整体的有序序列。
public class GuiBing {
public static void main(String[] args) {
int arr[] = new int[]{14,12,15,13,11,16};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
//这个high是长度减一
public static void sort(int[] arr,int low,int high){
int middle = (low+high)/2;
if(low<high){
//左边排序
sort(arr,low,middle);
//右边排序
sort(arr,middle+1,high);
//左右归并
digui(arr,low,middle,high);
}
}
public static void digui(int arr[],int low,int middle,int high){
int temp [] = new int[high-low+1];
// 左指针
int i = low;
// 右指针
int j = middle + 1;
int k = 0;
// 把较小的数先移到新数组中
while (i <= middle && j <= high) {
if (arr[i] < arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
//把左边剩余的数移入数组
while (i <= middle) {
temp[k++] = arr[i++];
}
//把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = arr[j++];
}
//把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
arr[k2 + low] = temp[k2];
}
}
}