归并排序
1.原理
排序一个数组,先把数组从中间分成前后两个部分,然后对前后两部分分别排序,再将排序好的两部分合并在一起
2.实现
public void mergeSort(int[] array){
mergeSortInternal(array,0,array.length-1);
}
private void mergeSortInternal(int[] array,int left,int right){
if (left >= right){
return;
}
int mid = (left+right)/2;
mergeSortInternal(array,left,mid);
mergeSortInternal(array,mid+1,right);
//合并
merge(array,left,mid,right);
}
private void merge(int[] array,int l,int m,int r){
int i = l;
int j = m+1;
int k = 0;
int[] extra = new int[r-l+1];
while (i <= m && j <= r){
if(array[i] <= array[j]){
extra[k++] = array[i++];
}else{
extra[k++] = array[j++];
}
}
//判断哪个数组还有元素
int start = i;
int end = m;
//第二个数组还有元素
if (j <= r){
start = j;
end = r;
}
//将剩余元素拷贝至临时数组中
while (start <= end){
extra[k++] = array[start++];
}
//将数组元素拷贝回原来的数组
for(i = 0;i <= r-l;i++){
array[l+i] = extra[i];
}
}
3.性能分析
1.时间复杂度
O(n*logn)
2.空间复杂度
O(n)
3.稳定性?
稳定性排序
来源:CSDN
作者:喜欢薄荷味
链接:https://blog.csdn.net/weixin_44369212/article/details/104413805