Я пытаюсь написать алгоритм сортировки на C для практики, но он не работает

#c

#c

Вопрос:

когда я запускаю его, он выводит список всех целых чисел в массиве, но затем он отбрасывает последние три цикла and и навсегда. я не могу понять это, некоторая конструктивная критика была бы оценена.

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

Комментарии:

1. последний допустимый индекс в массиве размером N равен N-1

2. Не похоже, что он будет сортировать. Вы просто меняете местами элементы, если они не в порядке, но вы передаете массив один раз. Практически, вам нужно сделать это N ^ 2 раза, чтобы убедиться, что весь массив отсортирован. N — длина массива.

3. Я рекомендую использовать отладчик. Отладчик позволит вам выполнить один шаг по вашему коду, просматривая значения в переменных.

4. Еще одна идея отладки: после каждого обмена выводите весь массив с индексами.

Ответ №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;
}
  

спасибо за ваше время и удачи в написании кода (:

Ответ №2:

это продолжается вечно, потому что цикл 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  ;
    }
}