[0..n ^ 3-1]の範囲のn個の整数の入力セットが与えられた場合、線形時間ソートアルゴリズムを提供します。
これは木曜日の私のテストのレビューであり、私はこの問題にどのように取り組むかわかりません。
関連する並べ替えも見てみましょう: pigeonhole sort または counting sort 、およびPukkuによって言及された radix sort 。
基数ソート を見てください。
人々が「ソートアルゴリズム」と言うとき、彼らはしばしば「比較ソートアルゴリズム」を指しています。これは、「これはそれよりも大きいか、小さいか」を尋ねることにのみ依存するアルゴリズムです。したがって、データに関するこの1つの質問に限定する場合、n * log(n)を超えることはありません(これは、データセットのn個の階乗可能な順序のlog(n)検索を実行した結果です)。 。
「比較ソート」の制約を回避し、「このデータの基数10の基数は何か」など、データの一部についてより高度な質問をすることができる場合は、任意の数の線形時間ソートアルゴリズムを考え出すことができます。彼らはより多くのメモリを必要とします。
これは時空間トレードオフです。比較ソートはRAMをほとんどまたはまったく使用せず、N * log(n)時間で実行されます。基数ソート(たとえば)は、O(n)時間AND O(log(radix))メモリで実行されます。
N = 2で数値が一意であれば、それは本当に簡単です。
複雑さ=> O(2n)
それ以外の場合は、基数ソートを使用します。
複雑さ=> O(kn)(うまくいけば)
wikipedia は、さまざまな並べ替えアルゴリズムとその複雑さを示しています。あなたはそれらをチェックしたいかもしれません
限られた範囲の数値のセットは、RANGEビットのビットマップで表すことができます。この場合、500 mbのビットマップなので、巨大なリスト以外の場合は、Radix Sortを使用することをお勧めします。数kに遭遇したら、bitmap [k] = 1に設定します。リストO(N)を1回走査します。
数字は、各数字の範囲が0〜n-1の3桁の数字と考えてください。これらの数値を基数ソートでソートします。各桁ごとに、シータ(n + n)時間を使用するカウントソートの呼び出しがあるため、合計実行時間はシータ(n)に対応します。