Сортировка целочисленного массива по возрастанию, ошибка сегментации: 11 - PullRequest
0 голосов
/ 10 февраля 2019

Предполагается, что функция сортирует массив случайных целых чисел по возрастанию.Я нашел способ решения этой проблемы, сортировку пузырьков, меняющую местами a на b, если b

void  ft_sort_integer_table(int *tab, int size)
{
  int i;
  int j;
  int t;

  i = 1;
  j = 0;
  t = 0;
  while (tab[j] != '\0')
  {
    if (tab[i] < tab[j])
    {
      t = tab[i];
      tab[i] = tab[j];
      tab[j] = t;
    }
    i++;
    j++;
  }
}

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Во-первых, ваша логика цикла while неверна.Символ '\ 0' относится к нулевому символу в конце строки.Это не имеет смысла, если вы сравните его с типом int.Во-вторых, логика, которую вы реализовали, сравнивает бок о бок элементы массива, а не один элемент со всеми остальными, и размещает его.Я бы порекомендовал вам изучить пузырьковую сортировку.Geekforgeeks - лучший источник для ребят из cse.Надеюсь, это решит.Ура !!Не стесняйтесь задавать вопросы

0 голосов
/ 10 февраля 2019

Вы передаете массив и размер своей функции сортировки, но нигде не используете size, чтобы потенциально i и j могли выйти за пределы, вызывая неопределенное поведение.

Массив intможет содержать 0, поэтому у вас должны быть другие критерии для завершения сортировки.Например, когда вы просматриваете все элементы в массиве [0..size] и не делаете свопинг - тогда он сортируется.

0 голосов
/ 10 февраля 2019

Если вы заранее не гарантируете, что значение 0 завершает ваш буфер и не появляется в другом месте массива (как у вас со строкой с нулевым завершением), вы не можете проверить, что tab[i] равно нулю, чтобы определить, что выдостигли конца массива.Ваша функция также принимает size в качестве параметра;почему бы не использовать это?

РЕДАКТИРОВАТЬ: Кроме того, алгоритм сортировки не работает в O (n).Пузырьковая сортировка, которая выглядит как то, что вы пытаетесь реализовать, требует двух вложенных циклов.

0 голосов
/ 10 февраля 2019

Вы не используете параметр size.Вместо этого вы пытаетесь найти нулевой терминатор, который не должен иметь массив int (в отличие от C-строки).Так что в случае, если вам нужно сравнить j с size и продолжать замену, пока массив не будет полностью отсортирован.

Кроме того, лучше использовать size_t size вместо int size, чтобы оставаться педантичным.

0 голосов
/ 10 февраля 2019

Пропуская правильность этой реализации алгоритма сортировки (поскольку это кажется неправильным), сегментация вызвана проверкой нулевого завершения, которую вы делаете.Символ NULL('\0') указан для строк или типов массивов символов в языке программирования C и используется для оповещения об их завершении.Он не работает с массивами типа int.Вы должны использовать аргумент size для итерации массива.

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