import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int [] arr = new int[]{5,0,1,7,8,4,6,3,9,2};
System.out.println("排序之前:");
System.out.println(Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1);
System.out.println("排序之後:");
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr, int low, int high){
int middle = (high + low)/2;
if (low < high){
//遞歸排序左邊
mergeSort(arr, low, middle);
//遞歸排序右邊
mergeSort(arr, middle +1, high);
//將遞歸排序好的左右兩邊合併
merge(arr, low, middle, high);
}
}
public static void merge(int[] arr, int low, int middle, int high){
//存儲歸併後的臨時數組
int[] temp = new int[high - low + 1];
int i = low;
int j = middle + 1;
//記錄臨時數組中存放數字的下標
int index = 0;
while (i <= middle && j <= high){
if (arr[i] < arr[j]){
temp[index] = arr[i];
i++;
} else {
temp[index] = arr[j];
j++;
}
index++;
}
//處理剩下的數據
while (j <= high){
temp[index] = arr[j];
j++;
index++;
}
while (i <= middle){
temp[index] = arr[i];
i++;
index++;
}
//將臨時數組中的數據放回原來的數組
for (int k = 0; k < temp.length; ++k){
arr[k + low] = temp[k];
}
}
}