package Sort;
//稳定
public class mergesort {
public static void main(String[] args) {
int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};
System.out.println("排序之前:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
//归并排序
mergeSort(a);
System.out.println();
System.out.println("排序之后:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
//归并排序前的一些准备
public static void mergeSort(int[] arr){
int[] tmp =new int[arr.length]; //tmp为辅助数组
internalMergeSort(arr, tmp, 0, arr.length-1);
}
private static void internalMergeSort(int[] a, int[] tmp, int left, int right){
//当left==right的时,已经不需要再划分了
if (left<right){
int middle = (left+right)/2;
internalMergeSort(a, tmp, left, middle); //左子数组
internalMergeSort(a, tmp, middle+1, right); //右子数组
mergeSortedArray(a, tmp, left, middle, right); //具体合并两个子数组,最近的递归返回点开始执行
}
}
// 合并两个有序子序列 arr[left, ..., middle] 和 arr[middle+1, ..., right]。tmp是辅助数组。
private static void mergeSortedArray(int arr[], int tmp[], int left, int middle, int right){
int i=left;
int j=middle+1;
int k=0; //k计数合并后数组大小
//原数据数组只有一个arr;left right middle 来分割,确定左右子数组
//下面操作即合并俩各自有序数组
while ( i<=middle && j<=right){
if (arr[i] <=arr[j]){
tmp[k++] = arr[i++];
}
else{
tmp[k++] = arr[j++];
}
}
while (i <=middle){//剩余部分存入tmp
tmp[k++] = arr[i++];
}
while ( j<=right){//剩余部分存入tmp
tmp[k++] = arr[j++];
}
//把数据复制回原数组
for (i=0; i<k; ++i){
arr[left+i] = tmp[i];
}
}
}