「 BrainF*** の最速の並べ替え」に取り組んでいるときに、このアルゴリズムを発見しました。これは O(N*k) で、k は入力の最大値です。O(N) の追加ストレージが必要です。
物理的なアナロジーは、N スタックのトークンがあることです。スタックの高さは、並べ替える値を表します。(各トークンはビットを表します)。別の N スタック用にスペースを確保します。トークンを持っている各スタックの一番上からトークンを 1 つ取り、手札が空になるまで、新しいセットの各スタックに右から左に 1 つ追加します。すべての元のスタックが空になるまで繰り返します。これで、新しいセットが左から右に昇順にソートされます
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に似ているように見えますが、まったく同じではないと思います。