Подсчет сортировки в массиве - PullRequest
0 голосов
/ 28 марта 2019

Я делаю алгоритм для сортировки. На первом шаге я инициализировал второй массив с 0. Во-вторых, я посчитал частоту элементов во втором цикле for. В третьем цикле я пытаюсь отсортировать массив. Третий цикл не выполняется в блоках кода. Также это не дает мне правильно отсортированный результат. Любая проблема с третьим циклом. Поскольку он меняет массив на 1-1-2-0-2-2-0-1-1, он должен быть 0-0-0-1-1-1-1-2-2-2

printf("Hello world!\n");
unsigned m=3;
unsigned n=10;
unsigned x;
unsigned k;
unsigned data[10] = {0, 2, 1, 1, 0, 2, 2, 0, 1, 1};
unsigned *count;

count =(unsigned *)malloc(sizeof(unsigned)*m);
int y=sizeof(data);

for(int i=0;i<m;i++)
{
    count[i]=0;

}

for(int j=0;j<n;j++)
{
    x=data[j];
    count[x]++;
}

 for(k=n-1;k>=0;k--)
    {
             data[count[data[k]]-1]=data[k];
             count[data[k]]=count[data[k]]-1;
    }


for(int i=0;i<n;i++)
{
    printf("%d \n",data[i]);

}


return 0;
}

Ответы [ 2 ]

1 голос
/ 28 марта 2019

В этой строке

for(k=n-1;k>=0;k--)

k равно unsigned, поэтому k >= 0 всегда верно.Когда целое число unsigned становится меньше нуля, его значение «оборачивается».

Кроме того, ваш цикл сортировки ничего не сортирует.Не может, потому что нет никаких сравнений.Вы можете рассмотреть свой алгоритм.

0 голосов
/ 29 марта 2019

Проблема (в дополнение к ошибке условия цикла, упомянутой в другом ответе) состоит в том, что это, кажется, комбинация двух несовместимых подходов сортировки подсчета.

Подход "пройти массив входов назад, вставив каждый элемент в соответствующее место в массиве вывода" требует отдельного массива вывода. Рассмотрим простой случай сортировки {2, 1}: если мы скопируем 1 в соответствующий слот в том же массиве, он становится {1, 1}, что в итоге станет нашим конечным результатом. Вместо этого 1 необходимо поместить в соответствующий слот отдельного массива, чтобы мы не перезаписывали 2.

Кроме того, этот подход требует от нас второго прохода над массивом count, чтобы изменить его семантическое значение с «количества элементов со значением n» на «индекс первого элемента со значением> n». Это достигается добавлением суммы к каждому элементу count (так что в вашем случае count будет переходить с {3, 4, 3} до {3, 7, 10}). После этого шага count[n] - 1 - это индекс в выходном массиве, в который следует поместить следующий n.

Учитывая, что вы сортируете целые числа, возможен и второй (более простой) подход: после того, как вы закончили свой первоначальный обход входного массива, count содержит всю необходимую информацию, поэтому вы можете свободно перезаписывать входной массив. Просто начните с начала и вставьте count[0] 0 с, count[1] 1 с и т. Д. Этот подход не требует какой-либо постобработки count или какого-либо отдельного выходного массива.

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