求大神帮我看一看这个快速排序C++程序拉你出错了,谢谢!vs没报错,但一运行就中断,

#include<iostream>usingnamespacestd;intPartition(int*A,intp,intr){intx,i,j;x=A[p];i=p... #include<iostream>
using namespace std;
int Partition(int* A,int p,int r)
{
int x,i,j;
x=A[p];
i=p;
for(j=p+1;j<=r;j++)
{
if(A[j]<=x) {
i=i+1;
swap (A[i],A[j]);
}
}
swap (A[p],A[i]);
return i;
}
void Quick_sort(int* A,int p,int r)
{
int q;
if(p<r){
q=Partition(A,p,r);
Quick_sort(A,p,q-1);
Quick_sort(A,q+1,r);
}
}
void swap(int*x,int*y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
int main()
{
int m,n,o;
int* S=new int[n];
cout<<"Please input the Sequence length:\n";
cin>>n;
cout<<"Please input the number sequence:\n";
for(m=1;m<=n;m++)
{
cin>> o;
S[m]=o;
}
Quick_sort(S,m,n);
for(m=1;m<=n;m++)
{
cout<<S[m];
}
cout<<endl;
}
展开
 我来答
箩勒个卜
2013-04-18
知道答主
回答量:28
采纳率:0%
帮助的人:18万
展开全部
兰州 你的n没有初始化啊...你咋么知道new的大小?! 一开始出错就是这个问题 还有问题请继续

兰州 基本上十把你的代码QuickSort函数全改了... 实测 通过... 有注释 望采纳....
.
void QuickSort(int a[],int low,int high)
//对元素a[low]~a[high]进行快排
{
int i=low,j=high;
int temp =a[low];
while(i<j)//循环控制条件
{
while(i<j && temp<=a[j]) j--;//在数组右端扫描
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && a[i]<temp ) i++;//在素组左端扫描
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
if(low<i) QuickSort(a,low,i-1);
if(i<high) QuickSort(a,j+1,high);
}
int main()
{
int m,n=100,o; //直接复制n比较大的一个数- - 怕你直接来个99...
int* S=new int[n];
cout<<"Please input the Sequence length:\n";
cin>>n;
cout<<"Please input the number sequence:\n";
for(m=0;m<n;m++) //一般数组下标是从0开始的 兰州下次要注意 你的代码数组会越界的
{
cin>> o;
S[m]=o; //其实我觉得o变量完全没有必要 直接cin>>S[m]就行了
}
QuickSort(S,0,n-1); //快排
for(m=0;m<n;m++) //输出
{
cout<<S[m]<<" " ;
}
cout<<endl;
}
更多追问追答
追问
我按你说的另n=100修改我自己写的那个代码,可以运行,但是为什么输入一下数据之后它没有排序直接按照原来数据输出,请问是怎么回事呢?
追答

首先回答是为什么你 数据直接按原来输出 是因为在main()函数中中 for(m=0;m<n;m++)  m等于n了 所以你调用QuickSort函数时没效果 因为根本没有运行

然后我根据你的思路在你代码基础上更改了写 发现你的Partition()函数其实做的相当于每次快排的事情 所以没必要返回位置了              只要循环调用即可  下面是更改后的代码 实测通过 


#include<iostream>

using namespace std;

int Partition(int* A,int p,int r)

//兰州你这个函数是获取A[p]经过一次快排后的下标吧 并且把小于A[p]的数放到前面去...

{

int x,i,j;

x=A[p];

i=p;

//for(j=p+1;j<=r;j++)        //由于更改后的main()函数从0开始的 j=r时会越界

for(j=p+1;j<r;j++)

if(A[j]<=x) {

i=i+1;

swap (A[i],A[j]);

}

}

swap (A[p],A[i]);

return i;

}

void Quick_sort(int* A,int p,int r)

{   

//int q;

//q=Partition(A,p,r);

//if(p<q-1)         //问题  Quick_sort(A,p,q-1);

//if(q+1<r)

//Quick_sort(A,q+1,r);

for(int i=p;i<r;i++)

Partition( A,i,r);

}

void swap(int*x,int*y) 

{

int t;

t=*x;

*x=*y;

*y=t;

}

int main()

{

int m,n,o;                  //n没初始化 导致下面new出错 你可以先输入n再new

cout<<"Please input the Sequence length:\n";

cin>>n;

int* S=new int[n];

cout<<"Please input the number sequence:\n";

//for(m=1;m<=n;m++)               //建议每次都从0开始 如果m==n这 数组会越界的 

for(m=0;m<n;m++) 

{

cin>> o;

S[m]=o;

}

//Quick_sort(S,m,n);               //这个调用有点不懂...这个时候m与n相等的啊   

Quick_sort(S,0,n);                // 排序从小标为0 的开始

for(m=0;m<n;m++)

{

cout<<S[m]<<" ";

}

cout<<endl;

}


兰州你还是把我单独写的QuickSort函数看看....那个是按照快排的步骤来写的

还有什么问题直接问

IT孤鹜
2013-04-18 · TA获得超过4198个赞
知道大有可为答主
回答量:3960
采纳率:71%
帮助的人:3586万
展开全部
#include<iostream>using namespace std;
int Partition(int* A,int p,int r)
{
int x,i,j;
x=A[p];
i=p;
for(j=p+1;j<=r;j++)
{
if(A[j]<=x) {
i=i+1;
swap (A[i],A[j]);
}
}
swap (A[p],A[i]);
return i;
}
void Quick_sort(int* A,int p,int r)
{
int q;
q=Partition(A,p,r);

if(p<q-1) //问题 Quick_sort(A,p,q-1);
if(q+1<r)
Quick_sort(A,q+1,r);

}void swap(int*x,int*y)
{
int t;
t=*x;
*x=*y;
*y=t;
}
int main()
{
int m,n,o;
int* S=new int[n];
cout<<"Please input the Sequence length:\n";
cin>>n;
cout<<"Please input the number sequence:\n";
for(m=1;m<=n;m++)
{
cin>> o;
S[m]=o;
}
Quick_sort(S,m,n);
for(m=1;m<=n;m++)
{
cout<<S[m];
}
cout<<endl;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式