void merge(int a[],int low,int high)//其实就是有序合并两个数组,用到一个辅助数组
{
int mid,i,j,k;
mid=(low+high)/2;
i=low,j=mid+1,k=0;
int b[10];
while(i<=mid&&j<=high)
{
if(a[i]>a[j])
{
b[k++]=a[j++];
}
else
{
b[k++]=a[i++];
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=high)
{
b[k++]=a[j++];
}
for(i=low,k=0;i<=high;i++,k++)//i的下标从low开始
{
a[i]=b[k];
}
}
void msort(int a[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
msort(a,low,mid);
msort(a,mid+1,high);
merge(a,low,high);
}
}
int main(int argc, char* argv[])
{
int a[6]={4,9,3,7,7,7};
msort(a,0,5);
for(int i=0;i<6;i++)
{
cout<<a[i]<<' ';
}
return 0;
}
执行大致过程:
划分,划分到最后a[0],a[1]…a[5],每个自成一个序列,然后将每个序列排好(当然不用排,因为只有一个关键字,但是代码还是会执行一遍merge函数),然后回退到(a[5],a[4]),(a[3],a[2]),(a[1]);合并排序,然后重复操作。