Проблема (в дополнение к ошибке условия цикла, упомянутой в другом ответе) состоит в том, что это, кажется, комбинация двух несовместимых подходов сортировки подсчета.
Подход "пройти массив входов назад, вставив каждый элемент в соответствующее место в массиве вывода" требует отдельного массива вывода. Рассмотрим простой случай сортировки {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
или какого-либо отдельного выходного массива.