public class MergeSort {
public static void sort(int nums[],int left,int right) {
if(left<right) {
// 中間節點
int mid = (left+right)/2;
// 一直拆分左邊直到left =0 mid = 0 right =1
sort(nums,left,mid);
// 一直拆分右邊直到left =0 mid = 0 right =1
sort(nums,mid+1,right);
// 排序邏輯,比較大小,並且將原序列排序
mergesort(nums,left,mid,right);
}
}
public static void mergesort(int nums[],int left,int mid,int right) {
// 左邊數組長度
int n1 = mid - left+1;
// 右邊數組長度
int n2 = right-mid;
int[] L = new int [n1];
int[] R = new int [n2];
// 將原序列第一個到第mid放入到左邊數組
for(int i = 0;i<n1;++i) {
L[i] = nums[left+i];
}
// 將原序列第mid+1放入到右邊數組
for(int j = 0;j<n2;++j) {
R[j] = nums[mid+1+j];
}
int i = 0;
int j = 0;
// 一直指向最左邊的數
int k = left;
// 將左右兩邊序列排序,並且插入到原序列
while(i<n1&&j<n2) {
if(L[i]<=R[j]) {
nums[k] = L[i];
i++;
}
else {
nums[k] = R[j];
j++;
}
k++;
}
// 當右邊排完後,將左邊的全部插入到序列
while(i<n1) {
nums[k] =L[i];
i++;
k++;
}
// 當左邊全部插入原序列後,將右邊全部插入到原序列
while(j<n2){
nums[k] = R[j];
j++;
k++;
}
}
public static void main(String[] args) {
int a[] = {2,4,5,7,1,2,3,6};
sort(a, 0, a.length-1);
for(int b :a) {
System.out.println(b);
}
}
}