/**
* 归并排序 : 稳定排序 时间复杂度:O(nlogn) 空间复杂度:O(n)
*/
public class MergeSort {
public static void sort(int[] arr){
int n = arr.length;
merge_sort(arr,0,n-1);
}
// 递归 分解数组及合并
public static void merge_sort(int[] arr,int p,int r){
// 递归终止条件
if(p >= r) return ;
// 取p到r之间的中间位置
int q = (p+r)/2;
// 分治递归
merge_sort(arr,p,q);
merge_sort(arr,q+1,r);
// 数组合并
merge(arr,p,q,r);
}
// 合并
public static void merge(int[] arr, int p, int q, int r){
int i = p; // 第一个数组的头指针
int j = q+1; // 第二个数组的头指针
int k = 0; // 临时数组的头指针
int[] temp = new int[r-p+1];
// 至少把一个数组中数据取完
while(i <= q && j <= r){
if(arr[i] <= arr[j]){
temp[k++] = arr[i++];
}else {
temp[k++] = arr[j++];
}
}
// 判断哪个子数组中有剩余的数据
int start = i;
int end = q;
if(j <= r){
start = j;
end = r;
}
// 将剩余数据copy到临时数组
while(start <= end){
temp[k++] = arr[start++];
}
// 将temp中数据拷贝回arr
System.arraycopy(temp,0,arr,p,r-p+1);
}
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1};
sort(arr);
for (int i : arr) {
System.out.print(i+" ");
}
}
}