我正在尝试用C ++编写排序算法以进行练习,但是它不起作用

时间:2020-09-05 16:51:33

标签: c++

当我运行它时,它列出了数组中的所有整数,但随后它丢弃了后三个并永远循环。我无法弄清楚,一些建设性的批评将不胜感激。

#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;
            }
        }
    }
}

2 个答案:

答案 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++;
    }
}