Оказывается, я все-таки не поленился.Это бисерная сортировка.Вот определение из оригинальной статьи (ссылка в формате PDF):
Рассмотрим набор A из n натуральных чисел.,,Для всех a в A капля a бусины (по одной бусе на стержень) вдоль стержней, начиная с 1-го стержня до a й род.Наконец, бусины, видимые уровень за уровнем от n -го уровня до первого уровня, представляют A в порядке возрастания.
Эта реализация преобразовываетэтот алгоритм двумя способами:
- Отразите «кадр», в котором он работает, через линию
y=x
.Это изменяет результат так, что число «шариков» в каждом столбце представляет результат, отсортированный в порядке убывания.В исходном алгоритме число «шариков» в каждой строке представляет выходные данные, отсортированные в порядке возрастания. - Вместо того, чтобы представлять «рамку» в виде двумерного массива логических значений, представьте его как 1массив целых чисел.Каждый слот в массиве соответствует «стержню», а его значение представляет количество шариков на этом стержне.Этот второй бит является естественным преобразованием - он просто признает, что, поскольку «шарик» не может плавать в воздухе, запись только количества шариков на стержне говорит нам все, что нужно знать о том, как они расположены на нем.Вы помещаете шарик на стержень, увеличивая соответствующее число.
Вот некоторые пояснения по этому первому пункту, взятые прямо из диаграммы на второй странице статьи: Поскольку алгоритм изначально реализован, массив[3, 2, 4, 2] будет представлена сеткой, которая выглядит следующим образом:
* * *
* *
* * * *
* *
И если шарики упадут, то получится:
* *
* *
* * *
* * * *
Затем вам нужно прочитатьстроки сверху вниз, чтобы получить вывод: [2, 2, 3, 4].В то время как в версии, которая дает результаты в порядке убывания, вы фактически делаете это вместо этого:
* *
* * * *
* * * * -> * * * *
* * * * * * * *