两道排序题,大家帮我调试下行吗?
第一题:用递归合并排序,有错
#include <iostream.h>
void merge(int c[],int d[],int l,int m,int r)
{
int i=1,j=m+1,k=l;
while((i<=m)&&(j<=r))
if(c[i]<=c[j])d[k++]=c[i++];
else d[k++]=c[j++];
if(i>m)for(int q=j;q<=r;q++)
d[k++]=c[q];
else for(int q=i;q<=m;q++)
d[k++]=c[q];
}
copy(int a[],int b[],int left,int right)
{
for(int i=0;i<right-left+1;i++,left++)
a[i]=b[left];
return *a;
}
void mergesort(int a[],int left,int right)
{ int b[9];
if(left<right){
int i=(left+right)/2;
mergesort(a,left,i);
mergesort(a,i+1,right);
merge(a,b,left,i,right);
copy(a,b,left,right);
}
}
void main()
{int a[]={6,9,8,5,1,7,4,3,2};
cout<<endl<<endl<<"yuan ";
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
cout<<endl<<"hou lai:";
mergesort(a,0,8);
for(int j=0;j<9;j++)
cout<<a[j]<<" ";
}
第二题:用非递归合并排序,有错
#include <iostream.h>
void merge(int c[],int d[],int l,int m,int r)
{
int i=1,j=m+1,k=l;
while((i<=m)&&(j<=r))
if(c[i]<=c[j])d[k++]=c[i++];
else d[k++]=c[j++];
if(i>m)for(int q=j;q<=r;q++)
d[k++]=c[q];
else for(int q=i;q<=m;q++)
d[k++]=c[q];
}
void mergepass(int x[],int y[],int s,int n)
{
int i=0;
while(i<=n-2*s){
merge(x,y,i,i+s-1,i+2*s-1);
i=i+2*s;
}
if(i+s<n)merge(x,y,i,i+s-1,n-1);
else for(int j=i;j<=n-1;j++)
y[j]=x[j];
}
void mergesort(int a[],int n)
{
int *b=new int[n];
int s=1;
while(s<n){
mergepass(a,b,s,n);
s+=s;
mergepass(b,a,s,n);
s+=s;
}
}
void main()
{int a[]={6,9,8,5,1,7,4,3,2};
cout<<endl<<endl<<"yuan ";
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
cout<<endl<<"hou lai:";
mergesort(a,9);
for(int j=0;j<9;j++)
cout<<a[j]<<" ";
}
问题点数:80、回复次数:10Top
1 楼arrowcy(长弓手)回复于 2005-03-26 19:03:16 得分 40
int i=1,j=m+1,k=l;
第一个函数中,这里应该是i=l(字母)吧Top
2 楼lianxiangpanjin(联想)回复于 2005-03-26 19:24:56 得分 0
哦, 第一首中K应该是为 一 ,发现一处错,但结果还是不对呀,arrowcy(长弓手) 再看看好吗Top
3 楼tsrs(调试人生)回复于 2005-03-26 19:32:36 得分 40
呵呵,第一题这样好象可以哦!
#include <iostream.h>
void merge(int c[],int d[],int l,int m,int r)
{
int i=l,j=m+1,k=l;
while((i<=m)&&(j<=r))
if(c[i]<=c[j])d[k++]=c[i++];
else d[k++]=c[j++];
if(i>m)
for(int q=j;q<=r;q++)
d[k++]=c[q];
else
for(int q=i;q<=m;q++)
d[k++]=c[q];
}
void copy(int a[],int b[],int left,int right){
for(int i=left; i <= right; i++, left++)
a[i]=b[left];
// return *a;
}
void mergesort(int a[],int left,int right){
int b[9];
if(left<right){
int i = (left + right)/2;
mergesort(a,left,i);
mergesort(a,i+1,right);
merge(a,b,left,i,right);
copy(a,b,left,right);
}
}
void main()
{
int a[]={6,9,8,5,1,7,4,3,2};
cout<<endl<<endl<<"Before sort:";
for(int i = 0; i < 9; i++)
cout<<a[i]<<"\t";
cout<<endl<<"After sort:"<<endl;
mergesort(a,0,8);
for(int j=0;j<9;j++)
cout<<a[j]<<" ";
}Top
4 楼tsrs(调试人生)回复于 2005-03-26 19:43:36 得分 0
第二题好象就照arrowcy(长弓手)说的就可以了。
呵呵……Top
5 楼lianxiangpanjin(联想)回复于 2005-03-26 19:48:56 得分 0
to tsrs(调试人生) :前40分给你了,我就纳闷了,除了COPY里不一样,你还改了哪呀?Top
6 楼lianxiangpanjin(联想)回复于 2005-03-26 19:53:39 得分 0
第二题,除了第4横的那个K我改成了数字的1,结果还是不对Top
7 楼xuelong_zl(点雨点[我身上咋就没MM的香水味涅??#-_-])回复于 2005-03-26 20:08:56 得分 0
mark一个,1和l看不出来,看来以后不能这样给变量起名,学到东东了Top
8 楼tsrs(调试人生)回复于 2005-03-26 20:10:09 得分 0
还有就是上边“ arrowcy(长弓手)”说的哪个啊!呵呵……
我这不改他说哪个的话一运行就死,汗……Top
9 楼tsrs(调试人生)回复于 2005-03-26 20:12:52 得分 0
我是把
int i=1,j=m+1,k=l;
中的i=1(数字),改成i=l(字母)就可以了!Top
10 楼lianxiangpanjin(联想)回复于 2005-03-26 20:38:13 得分 0
终于搞清了, 谢谢tsrs(调试人生),我是照书上抄来的, 看到I值时想都没想就写了数字的1,以后我会多小心的,一人40分Top




