Так как вы все равно используете C ++, почему бы не упростить код (резко), используя std::vector
вместо динамически распределяемых массивов (и утечку одного в процессе)?
std::vector<int>countSort(int* start, int* end, int maxvalue)
{
std::vector<int> B(end-start);
std::vector<int> C(maxvalue);
for (int *i = start; i < end; i++)
++C[*i];
// etc.
Кроме этого, логика, которую вы используете, не имеет смысла для меня. Я думаю, чтобы получить рабочий результат, вам, вероятно, лучше всего сесть с листом бумаги и решить, какие шаги вам нужно использовать. Я оставил счетную часть выше, потому что считаю, что многое правильно. Я не думаю, что остальное действительно так. Я даже дам довольно простую подсказку: как только вы закончите подсчет, вы можете сгенерировать B
(ваш результат), основываясь на только на том, что у вас есть в C
- вы делаете не нужно вообще ссылаться на исходный массив. Самый простой способ сделать это, как правило, использовать вложенный цикл. Также обратите внимание, что, вероятно, проще reserve
пробел в B
и использовать push_back
для помещения данных в него, а не устанавливать его начальный размер.