Каков этот алгоритм сортировки O (N * k)?

101
14

При работе над Самый быстрый сорт для BrainF ***" я обнаружил этот алгоритм, который является O (N * k), где k - максимальный значение на входе. Для этого требуется O (N) дополнительное хранилище.


Физическая аналогия заключается в том, что у вас есть N стеков токенов. Высота стека представляет значение, подлежащее сортировке. (Каждый токен представляет собой бит). Отложите место для других N стеков. Вы берете один токен с верхней части каждого стека с маркерами, а затем добавляете по одному в каждый стек в новом наборе справа налево, пока ваша рука не будет пустой. Повторяйте до тех пор, пока все исходные стеки не будут пустыми. Теперь новый набор сортируется по возрастанию слева направо


В C:


 void sort(int A[], int N)
{
int *R = calloc(N,sizeof(int));
do {
int i,count=0;
for (i=0;i<N;i++) if A[i] { count++; A[i]--;}
for (i=0;i<count;i++) R[i]++;
} while (count);
memcpy(A,R,N); //A is now sorted descending.
free(R);
}

Имеет ли этот алгоритм имя? Похоже на Bead Sort, но я не думаю, что это совершенно одинаково.

спросил(а) 2012-01-26T18:22:00+04:00 8 лет, 9 месяцев назад
1
Решение
116

Оказывается, я не был слишком ленив. Это бисероплетение. Здесь определение из оригинальной статьи (ссылка в формате PDF):


Рассмотрим множество A из n положительных целых чисел.,   Для всех a A удалите шарики (один шарик на стержень) вдоль стержней, начиная с 1-го стержня до а-го стержня. Наконец, бусины, видимые по уровню, от n-го уровня до первого уровня, представляют A в порядке возрастания.



Эта реализация преобразует этот алгоритм двумя способами:


    Отразить "фрейм", в котором он работает по линии y=x. Это изменяет результат таким образом, что количество "шариков" в каждом столбце представляет собой результат, отсортированный в порядке убывания. В исходном алгоритме количество "шариков" в каждой строке представляет собой результат, отсортированный в порядке возрастания.
    Вместо представления "фрейма" как двухмерного массива логических значений, представляйте его как одномерный массив целых чисел. Каждый слот в массиве соответствует "стержню", а его значение представляет количество шариков на этом стержне. Этот второй бит является естественным преобразованием - он просто признает, что, поскольку "шарик" не может плавать в воздухе, запись всего количества бусин на стержне говорит нам всем, что нужно знать о том, как они расположены на нем. Вы размещаете шарик на стержне, увеличивая соответствующий номер.

Здесь некоторые пояснения к этой первой точке, взятые прямо из диаграммы на второй странице статьи: поскольку алгоритм изначально реализован, массив [3, 2, 4, 2] будет представлен сеткой, которая выглядит так:

* * *
* *
* * * *
* *

И давая падать, получается:


* *
* *
* * *
* * * *

Затем вам нужно прочитать строки сверху донизу, чтобы получить результат: [2, 2, 3, 4]. Если в версии, которая дает результаты в порядке убывания, вы фактически делаете это вместо этого:


  *          *
* * * *
* * * * -> * * * *
* * * * * * * *

ответил(а) 2012-01-26T21:25:00+04:00 8 лет, 9 месяцев назад
41

Я знаю Radix Сортировать как один представитель в сложности O (n * K).

http://en.wikipedia.org/wiki/Radix_sort

ответил(а) 2012-01-26T18:24:00+04:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема