Возникли проблемы с сортировкой моего массива. Почему мой массив не сортируется должным образом? - PullRequest
1 голос
/ 12 октября 2019

Моя программа должна прочитать размер массива из командной строки, затем она должна заполнить массив случайными числами. Затем он должен отображать отсортированное и несортированное содержимое массива.

Создан цикл for для считывания случайных чисел в массив и отображения несортированного содержимого. Создан второй цикл for, вложенный в первый цикл для сортировки содержимого в массиве.

#include <time.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>


using namespace std;

int main(int argc, char * argv[], char **env)
{

    int SIZE = atoi(argv[1]);
    int *array = new int[SIZE];



    for(int i = 0; i < SIZE; i++)
    {
        array[i] = rand()% 1000;
        cout << i << ": " << array[i] << "\n";

        for(int j = 0; j < SIZE; j++)
        {
            if(array[j] > array[j + 1])
            {
                swap(array[j], array[j +1]);
            }

            cout << i << ": " << array[i] << "\n";
        }


    }


    return 0;
    }



I expect an output like

0: 350
1: 264
2: 897

0:264
1:350
2:897

I'm getting an output like
0:41
0:41
0:41
0:41
1:46
1:46
1:0
1:0
2:334
2:334
2:334
2:334

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Поскольку вы пытаетесь непрерывно сортировать массив до его инициализации. Кроме того, у вас есть неопределенное поведение, когда j == SIZE-1, потому что сравнивать array[j] > array[j+1] в этот момент недопустимо. array[j+1] является недопустимым индексом.

Вместо этого:

for(int i = 0; i < SIZE; i++)
{
    array[i] = rand()% 1000;
    cout << i << ": " << array[i] << "\n";

    for(int j = 0; j < SIZE; j++)
    {
        if(array[j] > array[j + 1])
        {
            swap(array[j], array[j +1]);
        }

        cout << i << ": " << array[i] << "\n";
    }
}

Это вместо:

   // randomly initialize the array
   for(int i = 0; i < SIZE; i++)
   {
        array[i] = rand()% 1000;
        cout << i << ": " << array[i] << "\n";
   }

   // sort
   for (int i = 0; i < SIZE; i++)
   {
       for(int j = i+1; j < SIZE; j++)
       {
            if(array[i] > array[j])
            {
                swap(array[i], array[j]);
            }
       }
   }

   // print results
   cout << "finished sorting" << endl;
   for(int i = 0; i < SIZE; i++)
   {
        cout << i << ": " << array[i] << "\n";
   }
1 голос
/ 12 октября 2019

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

Вам нужно разделить основной цикл на три:

  • первыйодин для инициализации массива;
  • второй для сортировки массива (это будет включать внутренний цикл, используемый для сортировки по пузырькам);
  • третий для печати результатов.

Отдельно вам также необходимо тщательно продумать граничные условия ваших циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...