Алгоритм корректен в обоих направлениях.Он также стабилен, как он есть у вас прямо сейчас.
Если вы измените последний for
на то, что вы сказали, он перестанет быть стабильным.
По существу, C[i] = how many elements <= i exist
после окончания третьего цикла for
.Таким образом, C[A[j]]
дает вам последнюю позицию элемента со значением A[j]
в отсортированном порядке, C[A[j]] - 1
вторую последнюю позицию элемента со значением A[j]
искоро.Вот почему вы уменьшаете значения в C
.
Из-за этого вам нужно начать итерацию исходного массива в обратном порядке, если вы заботитесь о стабильности: чтобы последний элемент со значением x
в исходном массиве был помещен первым в новый массив.Итерация вашего исходного массива в обратном порядке гарантирует, что x
ставится после всех остальных значений, равных x
, что делает алгоритм устойчивым.