public class MergeSort {
public static void main(String[] args) {
int []arr ={1,4,2,7,9,8,3,6};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr){
int[] nums = new int[arr.length];
sort(arr,0,arr.length-1,nums);
}
public static void sort(int[] arr,int left,int right,int[] nums){
if (left<right){
int mid = (left+right)/2;
//左边归并排序,使得左子序列有序
sort(arr,left,mid,nums);
//右边归并排序,使得右子序列有序
sort(arr,mid+1,right,nums);
//将两个有序子数组合并操作
merge(arr,left,mid,right,nums);
}
}
private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;//左子序列指针
int j = mid+1;//右子序列指针
int t = 0;
while (i<=mid && j<=right){
if (arr[i]<arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
}
}
//将左边剩余元素填充进temp中
while(i<=mid){
temp[t++] = arr[i++];
}
//将右序列剩余元素填充进temp中
while(j<=right){
temp[t++] = arr[j++];
}
t = 0;
//将temp中的元素全部拷贝到原数组中
while(left <= right){
arr[left++] = temp[t++];
}
}
}
排序-归并排序
于 2021-02-23 19:22:44 首次发布