下面展示一些 内联代码片
。
使用分割的思想解决问题
import java.util.Scanner;
public class MergeSort {
final static int Max=500000,SENTINEL=2000000000;
static int cnt = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int []A = new int[n];
for (int i = 0;i < n;i++){
A[i] = in.nextInt();
}
mergeSort(A,n,0,n);
for (int i = 0;i < n;i++){
System.out.println(A[i]);
}
System.out.println(cnt);
}
public static void mergeSort(int []A,int n,int left,int right){
if (left+1<right){
int mid = (left+right)/2;
//范围最右边不包含
mergeSort(A, n, left, mid);
mergeSort(A, n, mid, right);
merge(A,n,left,mid,right);
}
}
public static void merge(int []A,int n,int left,int mid,int right){
int L[]= new int[Max/2+2];
int R[]= new int[Max/2+2];
int n1 = mid - left;
int n2 = right - mid;
for (int i=0;i<n1;i++){
L[i] = A[left+i];
}
for (int i=0;i<n2;i++){
R[i] = A[mid+i];
}
//这样的话当比较到只剩一个元素时,则和最大值比较,然后取它自己进入数组,结束循环
L[n1]=R[n2]=SENTINEL;
int i = 0,j = 0;
for (int k = left;k < right;k++){
cnt++;
if (L[i] <= R[j]){
A[k]=L[i++];
}else {
A[k] = R[j++];
}
}
}
}