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();
}