C++ 快速排序中的无限循环?
当我运行这个程序时,我可以到达输入数字的阶段,但代码在此之后就停止工作了 光标闪烁,但我不能做任何事情,也不能输入任何其他内容。 如果代码中有错误,请指出,或者如果有一般错误,请告诉我C++ 快速排序中的无限循环?,c++,C++,当我运行这个程序时,我可以到达输入数字的阶段,但代码在此之后就停止工作了 光标闪烁,但我不能做任何事情,也不能输入任何其他内容。 如果代码中有错误,请指出,或者如果有一般错误,请告诉我 #include<iostream> using namespace std; void sort(int *a, int o, int p, int r); int main() { int a[10],i,o=5,p=0,r=9; cout<<"Enter the e
#include<iostream>
using namespace std;
void sort(int *a, int o, int p, int r);
int main()
{
int a[10],i,o=5,p=0,r=9;
cout<<"Enter the elments \n";
for(i=0; i<10; i++)
{
cin>>a[i];
}
sort(a,o,p,r);
cout<<"\n The Sorted Array is";
for(int yy=0; yy<10; yy++)
{
cout<<a[yy]<<"\n";
}
system("PAUSE");
return 0;
}
void sort(int *a, int o, int p, int r)
{
int ii=0,kj=10,uu,uv,tmp;
if(p<r)
{
while((ii<10)&&(kj>0)){
while(ii<=o){
ii++;
}
while(kj>=o){
kj--;
}
if(ii<kj)
{
tmp=a[ii];
a[ii] = a[kj];
a[kj] = tmp;
}
}
uu=(p+o)/2;
uv=(r+o)/2;
sort(a,uu,p,o);
sort(a,uv,o,r);
}
}
#包括
使用名称空间std;
无效排序(int*a、int o、int p、int r);
int main()
{
int a[10],i,o=5,p=0,r=9;
你为什么要在排序例程中比较索引?你不应该在索引中比较值吗
你认为这应该做什么
void sort(int *a, int o, int p, int r)
{ // call in with o=5, p=0, r=9
int ii=0,kj=10,uu,uv,tmp;
if(p<r)
{
while((ii<10)&&(kj>0)){
while(ii<=o){
ii++;
} // ii is now 6
while(kj>=o){
kj--;
} // kj is now 4
if(ii<kj) // NEVER true
{
tmp=a[ii];
a[ii] = a[kj];
a[kj] = tmp;
}
} // infinite loop
void排序(int*a、int o、int p、int r)
{//o=5,p=0,r=9时调用
int ii=0,kj=10,uu,uv,tmp;
如果(p为什么要在排序例程中比较索引?不应该在索引处比较值吗
你认为这应该做什么
void sort(int *a, int o, int p, int r)
{ // call in with o=5, p=0, r=9
int ii=0,kj=10,uu,uv,tmp;
if(p<r)
{
while((ii<10)&&(kj>0)){
while(ii<=o){
ii++;
} // ii is now 6
while(kj>=o){
kj--;
} // kj is now 4
if(ii<kj) // NEVER true
{
tmp=a[ii];
a[ii] = a[kj];
a[kj] = tmp;
}
} // infinite loop
void排序(int*a、int o、int p、int r)
{//o=5,p=0,r=9时调用
int ii=0,kj=10,uu,uv,tmp;
如果(你的调试器说什么?它在哪个区域循环?顺便说一句,Fortran风格的变量早就被弃用了…Fortran风格的变量?请详细说明?对于循环中非常简单的索引计数器之外的任何东西,单字母或双字母变量都是一种糟糕的编码方式。乍一看,我不知道ii、kj、uu或uv代表.a、I、o、p、r also伤了我的头。在Fortran77中,变量名决定了变量类型,但现在不是了。还有,当你有机会的时候,用谷歌搜索“神奇数字”,也不要这样做。@MichaelDorgan是一个Haskeller(越来越多)我更喜欢一个字母的名称,只要它们是不言而喻的,或者用注释来解释。一个字母的名称使代码更容易阅读,IMHO。我可以在非常明显的情况下使用一个字母变量,例如for循环I、j组合,或者甚至在三维空间操作中使用x、y、z,但我必须不同意单字母变量甚至注释在第一次创建时,更容易阅读。一旦创建了任意长度的函数,这些注释会很快超出心智范围-如果您要花时间注释变量名,为什么不使用不需要注释的变量名呢?调试器会说什么?它在哪个区域循环?顺便说一句,Fortran样式的变量很长nce已弃用…Fortran样式的变量?请详细说明?对于循环中非常简单的索引计数器之外的任何东西,单字母或双字母变量都是一种糟糕的编码方式。乍一看,我不知道ii、kj、uu或uv代表什么。a、I、o、p、r也伤了我的头。在Fortran 77中,变量名决定了变量类型,但不再是了。还有,当你有机会的时候用谷歌搜索“神奇数字”,但也不要这样做。@MichaelDorgan是哈斯凯勒(越来越多)我更喜欢一个字母的名称,只要它们是不言而喻的,或者用注释来解释。一个字母的名称使代码更容易阅读,IMHO。我可以在非常明显的情况下使用一个字母变量,例如for循环I、j组合,或者甚至在三维空间操作中使用x、y、z,但我必须不同意单字母变量甚至注释在第一次创建时,更容易阅读。一旦创建了任意长度的函数,这些注释会很快超出心智范围-如果你要花时间注释变量名,为什么不使用不需要注释的变量名呢?我的意思是,如果我写[ii]如果输入10个20..29的值,然后用硬编码的5作为支点调用排序,它会工作吗?我想,不太可能。@MichaelOrganger它真的没那么糟糕。@user2133056啊,好的。你是对的,这也会被更改。对不起。:)“USER2133056”这是不好的硬编码你的枢轴的位置像这样。这两个区域应该根据数组中的值在某个地方相遇,然后你在中间把你的支点撬开。从中间读取它是可以的,但是你应该把它换到边界上,然后从那里发展。我的意思是,如果我WRI。te a[ii]如果你输入10个20..29的值,然后调用你的排序,用它的硬编码5作为支点,它会工作吗?我想,不太可能。@MichaelOrganger它真的没那么糟糕。@user2133056啊,好的。你是对的,这也会被更改。对不起。:)我会考虑一下。@user2133056硬编码你的枢轴的位置是没有好处的。这两个区域应该根据数组中的值在某个地方相遇,然后在中间将你的支点撬开。从中间读取它是可以的,但是你应该把它换到边界上,然后从那里前进。