合并排序
#include<stdio.h> #define MAX_INT 65535//哨兵
void Merge(int *a,int p,int q,int r)//关键函数~ 合并
{
int L[50],R[50],b[100],i,j,k;
int len1=q-p+1;
int len2=r-q;
for(i=0;i<len1;i++)
{
L[i] = a[p+i];
}
L[len1]=MAX_INT;
//L[len1]=600;
for(i=0;i<len2;i++)
{
R[i] = a[q+1+i];
}
R[len2] = MAX_INT;
//R[len2]=600;
i=0;j=0;
for(k=0;k<r-p+1;k++)
{
if(L[i]>R[j])
{
b[k]=R[j];
j++;
}
else
{
b[k]=L[i];
i++;
}
}
for(i=0;i<r-p+1;i++)//把这个忘了就出错了。。
a[p+i]=b[i];
}
void MergeSort(int *a,int p,int q)//递归调用
{
int m;
if(p<q)
{
m=(p+q)/2;
MergeSort(a,p,m);
MergeSort(a,m+1,q);
Merge(a,p,m,q);
}
else return;
}
int main()
{
int b[100],n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
MergeSort(b,0,n-1);
for(i=0;i<n;i++)
{
printf("%d ",b[i]);
}
return 1;
}
运行截图:

看着算法导论写的代码,只不过忘了合并排序不是原地排序的,居然每次把排好的结果直接赋值给原数组。。于是出错了~
浙公网安备 33010602011771号