按着算法导论的讲解,自己去尝试编这个程序,主体其实早好了,全败在细节上。于是乎改了又改,就是不知道自己的错在哪儿,后来又网搜另外一下其他人的程序,发现竟没找到和我一样方法的程序,最后只能试着自己改,最后总算运行了。运行最坏情况时间代价为nlgn..另外此为输入10数字排序。
#include<stdio.h>
#include<stdlib.h>#define INF 0xfffffff
void merge(int *a,int p,int q,int r)
{
int n1,n2;
int i,j;
int k;
n1=q-p+1;
n2=r-q;
int l[n1];
int d[n2];
for (i=0;i<n1;i++)
{
l[i]=a[p+i];
}
l[n1]=INF;
for(j=0;j<n2;j++)
{
d[j]=a[q+j+1];
}
d[n2]=INF;
i=0;j=0;
for(k=p;k<=r;k++)
if(l[i]<=d[j])
{
a[k]=l[i];
i++;
}
else
{
a[k]=d[j];
j++;
}
}
void mergesort(int a[],int p,int r)
{ int q;
if(p<r)
{
q=(p+r)/2;
mergesort(a,p,q);
mergesort(a,q+1,r);
merge(a,p,q,r);
}
}
int main ()
{ int i,j;
int c[10];
int p=0,r=9;
for(i=0;i<10;i++)
scanf("%d",&c[i]);
mergesort(c,p,r);
for(j=0;j<10;j++)
printf("%d ",c[j]);
printf("\n");
system("pause");
return 0;
}
下面这个程序也为mergesort.是从别处粘来的,忘了从哪儿了,还望原作者见谅
#include <stdio.h>
#include <stdlib.h>
void Merge(int *R,int low,int m,int high)
{
int i=low,j=m+1,p=0;
int *R1;
R1=(int *)malloc((high-low+1)*sizeof(int));
if(!R1)
return;
while(i<=m&&j<=high)
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
while(i<=m)
R1[p++]=R[i++];
while(j<=high)
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];
}
void MergeSort(int R[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(R,low,mid);
MergeSort(R,mid+1,high);
Merge(R,low,mid,high);
}
}
int main(void)
{
int i;
int a[10];
int low=0,high=9;
for (i = 0; i < 10; i++)
scanf("%d",&a[i]);
MergeSort(a,low,high);
for(i=low;i<=high;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}