归并排序的基本思想:将两个或两个以上的有序表合并成一个有序表,将两个有序表合并成一个有序表的过程称为 2-路归并
归并排序
将含有n个关键字的序列看成是n个有序的子序列,然后两两归并,如此重复,直到得到一个长度为n的有序序列为止。
void Merge(int a[],int L,int M,int R)//归并相邻两个有序子序列
{
int LSize=M-L,RSize=R-M+1;
int left[LSize],right[RSize];
for(int i=L;i<M;i++)
{
left[i-L]=a[i];
}
for(int i=M;i<=R;i++)
{
right[i-M]=a[i];
}
int i=0,j=0,l=L;
while(i<LSize&&j<RSize)
{
if(left[i]<right[j])
{
a[l++]=left[i++];
}
else
{
a[l++]=right[j++];
}
}
while(i<LSize)
{
a[l++]=left[i++];
}
while(j<RSize)
{
a[l++]=right[j++];
}
return ;
}
void MergeSort(int a[],int L,int R)//归并排序
{
if(L==R)
{
return ;
}
else
{
int M=(L+R)/2;
MergeSort(a,L,M);
MergeSort(a,M+1,R);
Merge(a,L,M+1,R);
}
return ;
}
稳定性:稳定
时间复杂度:
平均:O(nlog2n)
最好:O(nlog2n)
最坏:O(nlog2n)
空间复杂度:O(n)
归并排序是稳定排序,可用于链式结构,但递归实现时需要开辟相应的递归工作栈