特点
稳定
采用分治法
java对象排序专用,归并排序的改进排序Timsort
基本思想
把数组从中间分成两个,对这两个子序列分别采用归并排序;将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
时空复杂度
时间复杂度:
平均:O(nlog2n)
最好:O(nlog2n)
最坏:O(nlog2n)
空间复杂度:O(n);
算法描述
把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
算法
/**
* 归并排序,分割
* @param arr 数组
* @param left 左边界
* @param right 右边界
*/
public static void mergeSort(int[] arr, int left, int right) {
if (left == right) {
//System.out.println("left=" + left);
return;
}
//分成两半
int mid = left + (right-left)/2;
//左边排序
mergeSort(arr,left,mid);
//右边排序
mergeSort(arr,mid+1,right);
//合并
merge(arr,left,mid+1,right);
}
/**
* 归并排序,把两个分支合起来
*
* @param arr 待排序的数组
* @param leftPtr 左指针
* @param rightPtr 右指针
* @param rightBound 右边界
*/
private static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound) {
int mid = rightPtr-1;
//临时变量,用来存储归并好的数组
int[] temp = new int[rightBound-leftPtr+1];
//三个指针,
int i = leftPtr;
int j = rightPtr;
int k = 0;
while(i <= mid && j <= rightBound){
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= rightBound) temp[k++] = arr[j++];
//System.out.println("temp[]");
//print(temp);
for (int m = 0; m < temp.length; m++) arr[leftPtr + m] = temp[m];
}