当我运行它时,它列出了数组中的所有整数,但随后它丢弃了后三个并永远循环。我无法弄清楚,一些建设性的批评将不胜感激。
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
for(int i = 0; i <= len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
for(int i = 0; i <= len; i++)
{
if(ary[i] <= ary[i + 1])
{
right++;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
}
}
答案 0 :(得分:1)
因此,您在此处尝试执行的操作类似于气泡排序。 我已经修复了您代码中的错误,这是一个有效的版本:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
// the value of the variable 'right' needs to be reset to 1 everytime you loop
right = 1;
for(int i = 0; i < len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
// as arrays in c++ are zero-indexed, the last element is index len - 1
for(int i = 0; i < len - 1; i++)
{
if(ary[i] <= ary[i + 1])
{
right++;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
}
}
有一件事真的引起了我的注意,这确实是一种不好的做法:交换变量的方式
// you only need at most 3 variables to swap
g = ary[i];
ary[i] = ary[i+1];
ary[i+1] = g;
// or you can do built-in:
std::swap(ary[i], ary[i+1]);
尽管尝试自己弄清楚东西是很好的做法,并且通常会有所帮助,但在这种情况下,我认为您应该阅读一些文档。 供参考,这是常规气泡排序的样子:
#include <iostream>
int a[] = {3, 7, 8, 1, 3, 45, 19};
const int len = sizeof(a) / sizeof(int);
int main () {
for (int i=0; i<len; ++i) {
for (int j=i+1; j<len; ++j) {
if (a[i] > a[j])
std::swap(a[i], a[j]);
}
}
for (int i=0; i<len; ++i)
std::cout << a[i] << ' ';
return 0;
}
感谢您的时间和好运的编码(:
答案 1 :(得分:0)
这将永远消失,因为for循环会将最后一项i [8]与i [8 + 1]和i [8 + 1]比较为空 所以要解决这个问题
for(int i = 0; i < len - 1; i++)
代替
for(int i = 0; i <= len; i++)
尝试一下:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int Round = 0;
int g;
int g2;
int main()
{
while(Round != len)
{
for(int i = 0; i < len; i++)
std::cout << ", " << ary[i];
std::cout << "\n";
usleep(120000);
for(int i = 0; i < len - 1; i++)
{
if(ary[i] <= ary[i + 1])
{
continue;
}
else
{
g = ary[i];
g2 = ary[i + 1];
ary[i] = g2;
ary[i + 1] = g;
}
}
Round++;
}
}