请告诉我为什么这段代码会给出垃圾值 编译得很好,基于Cormen算法实现了这种合并排序 基本上在动态数组中取给定数字。采用两个void函数。一个是通过合并排序合并两个子数组,另一个是递归地将数组拆分为子数组
#include<iostream>
using namespace std;
void merge(int *A,int p, int q, int r)// a function to merge two //sub arrays
{
int n1= q-p+1;
int n2=r-q;
int L[n1];
int R[n2];
for (int i=0;i<n1;i++)
{
L[i]=A[p+i];
}
int m=1;
for(int j=0; j<n2 ;j++)
{
R[j]=A[q+m];
m=m+1;
}
int i=0;
int j=0;
for(int k=0;k<r;k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i=i+1;
}
else
{
A[k]=R[j];
j=j+1;
}
}
}
void mergesort(int *A,int p,int r)// dividng the sequence to sub arrays
{
if (p<r)
{
int q;
q=(p+r)/2;
mergesort(A,p,q);
mergesort(A,(q+1),r);
merge(A,p,q,r);
}
}
int main()
{
int n;
cout<<"Enter the number of numbers to be sorted by merge sort"<<endl;
cin>>n;
int* a=NULL;
a=new int[n];
int temp;
cout<<"Enter the numbers"<<endl;
for(int i=0;i<n;i++)
{
cin>>temp;
*(a+i)=temp;// inputting the given numbers into a dynamic array
}
cout<<"The given numbers are:"<<endl;
for(int j=0;j<n;j++)
cout<<*(a+j)<<" ";
mergesort(a,0,n-1);
cout<<"The merged sorted numbers are:"<<endl;
for(int s=0;s<n;s++)
cout<<*(a+s)<<" ";
delete [] a;
system("pause");
return 0;
}
答案 0 :(得分:0)
你的代码中到处都是错误的。例如:
main
中的使用情况,mergesort
应该对索引[0,n-1]
的子列表进行排序。有了这个意思,你在mergesort
中的递归说为了对索引[p,r-1]
进行排序,你应该先排序[p,q-1]
然后排序[q+1,r-1]
:你完全忽略索引{ {1}}。
同样地,q
感到困惑:一旦你在处理merge
(L
应该是A[i]
)时修正拼写错误,就需要A[p+i]
作为一个列表和[p,q]
作为另一个列表:请注意您复制条目[q,r]
两次,并且当您可能不应该复制q
时。
要修复代码,您需要准确理清应该处理的所有内容。这不是一个硬问题,你只需要自己写下明确 正好你所有的函数和循环和东西是什么应该做的。
这些天的典型惯例是半开放的间隔:您通常应该考虑从列表中获取索引r
。 ([p,q)
与[p,q)
相同)以下是几个为何首选的例子:
[p,q-1]
的条目数仅为[p,r)
r-p
循环遍历for
通常是[p,r)
(不是for(i=p; i<r; ++i)
)<=
拆分为多个部分,可为您提供[p,r)
和[p,q)
的时间间隔 - 无需担心记得在地方添加[q,r)
。 e.g。 1
通常设计为从索引merge
获取第一个列表,从索引[p,q)
获取第二个列表。