mergeSort 归并排序
1. 基本描述
将两个 有序 的数列 合并成一个有序数列。归并排序的核心就是这么一句话。
这里有两个重点
- 前提 有序数列
- 合并
问题就在这里,一个无序的数组怎么前提是有序。
一个数的数列就是有序。
这就涉及到归并排序算法细节了。
时间复杂度
$$
O(nlog_2n)
$$
空间复杂度
$$
T(n)
$$
2.算法流程
-
从上往下分解
-
从下往上归并
所以归并排序,在其名字中其实忽略了分解。那么同样采用递归实现。
3. 算法实现
从上往下分解
private static void merge(int[] array, int l, int r){
if(l==r) {
return ;
}
int mid=(l+r)/2;
merge(array,l,mid);
merge(array,mid+1,r);
mergeSort(array,l,mid+1,r);
}
归并算法
- 扩充
- 拷贝
- 归并
- 处理尾部
private static void mergeSort(int[] array, int l, int mid, int r) {
int [] left=new int [mid-l];
int []right=new int [r-mid+1];
System.arraycopy(array,l,left,0,left.length);
System.arraycopy(array,mid,right,0,right.length);
int i=0,j=0;
int post=l;
while(i<left.length&&j<right.length){
if(left[i]<right[j])
array[post]=left[i++];
else
array[post]=right[j++];
post++;
}
for (;i<left.length;i++)
array[post++]=left[i];
for (;j<right.length;j++)
array[post++]=right[j];
}