package SortArith;
/**
* 归并排序
* 递归,将原数组一分为二为两个数组,分别对两数组进行排序,将两排序后数组进行合并。
* @author lwk
* 时间复杂度O(nlogn)
* 空间复杂度O(n+logn)
* 稳定排序
*/
public class MergeSort {
public static void mergeSort(int[] array){
if(array == null || array.length ==0){
return;
}
mergeSort(array,0,array.length-1);
}
public static void mergeSort(int[] array,int start,int end){
if(start < end){
int mid = (start + end)/2;
//将数组一分为二,分别排序后,再合并数组
mergeSort(array,start,mid);
mergeSort(array, mid+1, end);
//合并数组时要进行排序
merge(array,start,mid,end);
}
}
public static void merge(int[] array,int start,int mid,int end){
//构建新数组,将左右数组合并为有序的新数组
int[] tempArr = new int[end - start + 1];
//第一个数组的起始位置为start
int left = start;
//第二个数组的起始位置
int right = mid + 1;
//新数组的起始位置为零
int third = 0;
while(left <= mid && right <= end){
if(array[left] <= array[right]){
//将较小值先赋给新数组
tempArr[third++] = array[left++];
}else{
tempArr[third++] = array[right++];
}
}
//若左数组指针未指向mid,说明左数组还有余下元素待装入新数组
while(left <= mid){
tempArr[third++] = array[left++];
}
while(right <= end){
tempArr[third++] = array[right++];
}
//此时新数组即为合并后的有序数组
//将新数组的值全部赋给array
for (int i = 0; i < tempArr.length; i++) {
array[start++] = tempArr[i];
}
}
}