public static void mergeSort(int[] arr) {
mSort(arr, 0, arr.length-1);
}
/**
* 递归分治
* @param arr 待排数组
* @param left 左指针
* @param right 右指针
*/
public static void mSort(int[] arr, int left, int right) {
if(left >= right)
return ;
int mid = (left + right) / 2;
mSort(arr, left, mid); //递归排序左边
mSort(arr, mid+1, right); //递归排序右边
merge(arr, left, mid, right); //合并
}
//将有序数组s[m…p]和s[p+1 …n]归并到数组s[m…n]
public static void merge(int s[], int m, int p, int n){
//s[m…p]从m开始,s[p+1 …n]数组从p+1开始,辅助数组sm[]从k=0开始
int i=m,j=p+1,k=0;
int sm[] = new int[n-m+1];
for(; i<=p && j<=n; k++){
//俩个待合并有序数组依次比较选出小的赋值给辅助数组
//选择哪个数组的值,哪个数组就i++/j++,再重新进行比较
if(s[i]<s[j]){
sm[k] = s[i++];
}else {
sm[k] = s[j++];
}
}
//跳出for循环后,哪个数组有剩余,就把哪个数组的剩余数据依次复制给辅助数组sm[]
while (i<=p){
sm[k++] = s[i++];
}
while (j<=n){
sm[k++] = s[j++];
}
//将sm[]赋值给s[]
for(int x=0; x<sm.length; x++){
s[m+x] = sm[x];
}
}
//主函数
public static void main(String[] args) {
int a[] = {3,2,5,8,4,7,6,9};
mergeSort(a);
for(int x=0; x<8; x++){
System.out.print(a[x]+" ");
}
System.out.println();
}