WedX - журнал о программировании и компьютерных науках

Перестановка массива в C для отделения отрицательных чисел от положительных путем сохранения порядка

Я намеревался отсортировать array, помещая отрицательные целые числа впереди (слева) от массива и оставляя положительные целые числа справа, но без изменения их порядка. Почему-то не работала расстановка минусов и плюсов, а так же программа показывает нули вместо плюсов в resultArr. Был бы признателен, если бы кто-нибудь мог помочь с тем, что я делаю неправильно.

#include <stdio.h>

#define LENGTH 9

int numArr[LENGTH] = {5, -7, -87, -221, 7, 97, 1, -5, 5};
int resultArr[LENGTH];
int i;
int j = 0;
int disp;

int main()
{
    for (int i = 1; i < LENGTH; i++)
    {
        disp = numArr[i];
        if (disp > 0)
    {
        continue;
    }
    
    j = i - 1;
    
    while (resultArr[j] > 0 && j>= 0)
    {
        resultArr[j + 1] = resultArr[j];
        j--;
    }
    resultArr[j + 1] = disp;
}

printf("Original array : %d ", *numArr);
for (i = 1; i < LENGTH; i++)
{
    printf(" %d ", numArr[i]);
}
    
printf("Rearranged array : ");
for (j = 0; j < LENGTH; j++)
{
    printf(" %d ", resultArr[j]);
}

return 0;
}
21.09.2020

  • Вы забыли инициализировать j. Следовательно, j, вероятно, имеет бессмысленное значение, а resultArr[j] = numArr[i]; в первом цикле копирует numArr[i] в какое-то случайное место в памяти или даже может привести к сбою программы или другому неопределенному поведению. 21.09.2020
  • Похоже, вы отредактировали свой вопрос после моего комментария, чтобы исправить проблему с переменной j. Ваш код работает сейчас? У вас все еще есть вопросы по этому поводу? 21.09.2020
  • @Stef спасибо за ваш комментарий, да, я отредактировал его, но последовательность чисел в resultArray по-прежнему такая же, как и в numArray, а также все положительные числа возвращаются как нули ... 21.09.2020
  • Вы удалили строку resultArr[j] = numArr[i];. Вы собирались удалить его? Теперь первый цикл ничего не делает. 21.09.2020
  • @Stef я удалил его и поместил обратно, результат все равно тот же. вывод в обоих случаях по-прежнему выглядит следующим образом: Исходный массив: 5 -7 -87 -221 7 97 1 -5 5 Перестроенный массив: -7 -87 -221 0 0 0 -5 0 21.09.2020
  • Строка resultArr[j + 1] = disp; в конце крайне подозрительна; disp было присвоено в первом цикле и равно numArr[LENGTH-1]. 21.09.2020
  • @Stef без этой строки все, что я получаю в resultArr, это нули 21.09.2020

Ответы:


1

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

Вот моя версия кода:

#include <stdio.h>      /* printf */

#define LENGTH 9

void moveNegativeToFront(int const *numArr, int *resultArr, int length)
{
  int i;
  int j;
  j = 0;
  for (i = 0; i < length; i++)      /* first loop: move negative to front */
  {
    if (numArr[i] < 0)
    {
      resultArr[j] = numArr[i];
      j++;
    }
  }
  /* note that j is not reinitialised here */
  for (i = 0; i < length; i++)      /* second loop: move positive to back */
  {
    if (numArr[i] >= 0)
    {
      resultArr[j] = numArr[i];
      j++;
    }
  }
}

int main(void)
{
  int numArr[LENGTH] = {5, -7, -87, -221, 7, 97, 1, -5, 5};
  int resultArr[LENGTH];

  int i;

  printf("Original array : ");
  for (i = 0; i < LENGTH; i++)
  {
    printf(" %d ", numArr[i]);
  }
  printf("\n");

  moveNegativeToFront(numArr, resultArr, LENGTH);

  printf("Rearranged array : ");
  for (i = 0; i < LENGTH; i++)
  {
    printf(" %d ", resultArr[i]);
  }
  printf("\n");

  return 0;
}

Вывод:

Original array :  5  -7  -87  -221  7  97  1  -5  5 
Rearranged array :  -7  -87  -221  -5  5  7  97  1  5 

Объяснение двух циклов и визуализация i и j во время выполнения:

at beginning:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
          ^ i
resArr = [                                     ]
          ^ j

during first loop:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
                               ^ i
resArr = [-7  -87  -221                        ]
                         ^ j

just after first loop:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
                                                 ^ i
resArr = [-7  -87  -221  -5                    ]
                             ^ j

just before second loop:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
           ^ i
resArr = [-7  -87  -221  -5                    ]
                             ^ j

during second loop:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
                                  ^ i
resArr = [-7  -87  -221    -5  5   7           ]
                                      ^ j

at the end:
numArr = [ 5   -7   -87  -221  7  97  1  -5  5 ]
                                                 ^ i
resArr = [-7  -87  -221    -5  5   7  97  1  5 ]
                                                 ^ j

Что я изменил:

  • Я исправил два цикла в основном алгоритме, чтобы один чётко копировал отрицательные числа, а другой чётко копировал положительные числа
  • Я добавил несколько комментариев в код, чтобы объяснить, что он делает.
  • Вынес основной алгоритм в отдельную функцию, а тест в main()
  • Я удалил все ваши глобальные переменные и заменил их локальными переменными
  • Я добавил printf("\n"); в двух местах, чтобы добавить новые строки и очистить стандартный вывод.
21.09.2020
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]