То, что вы показываете, является сортировкой подсчета. Другими вариантами, не относящимися к сравнению, были бы сортировка по сегментам или сегментам, которые также имеют O (n) временную сложность.
Эту проблему также можно решить с помощью функции 3-стороннего разбиения, основанной на сравнении, которая использует сравнения и свопы с временной сложностью O (n).
https://en.wikipedia.org/wiki/Dutch_national_flag_problem#Pseudocode
Обычно сортировки на основе сравнения занимают время O (n log (n)), но проблема с национальным флагом Нидерландов не требует этого.
Функция трехстороннего разделения может быть расширена для обработки большего количества цветов. Первый проход разделяет массив на 3 вложенных массива: маленький, средний и большой, затем повторяет процесс для каждого вложенного массива, разделяя его на 3 вспомогательных массива и так далее. За 2 прохода можно выполнить 9 цветов, 1-й проход разделяется на маленький, средний, большой, а 2-й проход разделяет каждый суб-массив на 3 части, что также является O (n) временной сложностью. Для n элементов и k цветов временная сложность равна O (n⌈log3 (k) ⌉), но, поскольку k является постоянной, временная сложность составляет O (n).