一、伪代码
1. MergeSort(A,l,r)
2. Merge(A,l,m,r)
二、C/C++代码
/*******************************************************************
Function:Merge
Description:将两个有序的数组A[l,m]和A[m+1,r]合并为一个有序的数组
Input:数组A及下标l,m,r
Output:有序数组A
********************************************************************/
void Merge(int A[],int l,int m,int r){
int x = m-l+1,y=r-m;//x表示数组A[l...m]的长度,y表示数组A[m+1,r]的长度
int *B = new int[x];
int *C = new int[y];
for(int i=0,j=l;i<x;i++,j++)//将A[l,m]复制到B中
B[i]=A[j];
for(int i=0,j=m+1;i<y;i++,j++)//将A[m+1,r]复制到C中
C[i]=A[j];
int i=0,j=0,k=l;//i是数组B的游标,j是数组C的游标,k是数组A的游标
while(i<x&&j<y){
if(B[i]<=C[j])
A[k++]=B[i++];
else
A[k++]=C[j++];
}
//如果B或者C中还有剩余的数字,则全部复制到A中
if(i>=x)
while(j<y)A[k++]=C[j++];
else
while(i<x)A[k++]=B[i++];
}
/************************************************
Function:MergeSort
Description:对数组A[l,r]进行二分归并排序
Input:数组A及其下标l,r
Output:有序数组A
*************************************************/
void MergeSort(int A[],int l,int r){
if(l<r){
int m = (l+r)/2;
MergeSort(A,l,m);
MergeSort(A,m+1,r);
Merge(A,l,m,r);
}
}
三、时间复杂度
由分治的思想知,对一个数组排序可以转换为将原数组一分为二,各种排序后在合并的过程。设该算法的最坏时间复杂度为W(n),则递推公式如下:
其中n-1是将两个有序数组合并成一个有序数组的时间复杂度。
解法一:
解法二:
利用https://blog.csdn.net/bqw18744018044/article/details/79596014中介绍的主定理。