归并排序是先将序列划分,然后进行递归,处理,最后把划分的序列合并
void MergeSort(int r[],int s,int t)//r是要排序的序列,s是起始位置,t是末尾值
{
int m,r1[1000];//排好序的序列合并到r1内
if(s==t)return;//如果首位置和末位置相当,则排序完成,也为递归退出的条件
else{
m=(s+t)/2;//去m为二者的中间位置
MergeSort(r,s,m);//对前一半进行排序,此时会通过递归进入,且首尾位置都已改变
MergeSort(r,m+1,t);//对后一半进行排序
Merge(r,r1,s,m,t);//合并两个已排序的子序列
for(int i=s,i<=t;i++)r[i]=r1[i];
}
}
void Merge(int r[],int r1[],int s,int m,int t)
{
i=s,j=m+1,k=s;//i,k被赋值给数组的初始位置,j为中间位置
while(i<=m&&j<=t)//当在两个序列内时,解决一个为四个,一个为五个
{
if(r[i]<=r[j])r1[k++]=r[i++];
else r1[k++]=r[j++];
//因为虽然在一半是顺序,合并起来并不一定有序,所以分别取小值放到序列中
while(i<=m) r1[k++]=r[i++];
while(j<=t) r1[k++]=r[j++];
//解决奇数的问题
}
时间复杂度为nlog2n