归并排序——分治
- 确定分界点:mid=(l+r)/2
- 递归排序left、right
- 归并:合二为一## 重点
public class MergeSort {
public static void mergeSort(int[] arr, int l, int r) {
if(l >= r) return;
int mid = (l + r)/2;
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
int N = 100010;
int[] tmp = new int[N];
int k = 0;
int i = 0;
int j = mid + 1;
while(i <= mid && j <= r) {
if(arr[i] <= arr[j]) tmp[k++] = arr[i++];
else tmp[k++] = arr[j++];
}
while(i <= mid) {
tmp[k++] = arr[i++];
}
while(j <= r) {
tmp[k++] = arr[j++];
}
for(i = 0,j = 0;i <= r;i++,j++) {
arr[i] = tmp[j];
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组元素个数:");
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0;i <arr.length;i++) {
arr[i] = sc.nextInt();
}
mergeSort(arr,0,n-1);
System.out.print("排好序后的数组为:");
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
}