[0..n ^ 3-1]の範囲のn個の整数の入力セットが与えられた場合、線形時間ソートアルゴリズムを提供します。
これは木曜日の私のテストのレビューであり、この問題にどのように取り組むべきかわかりません。
[0..n ^ 3-1]の範囲のn個の整数の入力セットが与えられた場合、線形時間ソートアルゴリズムを提供します。
これは木曜日の私のテストのレビューであり、この問題にどのように取り組むべきかわかりません。
関連するソートも見てみましょう: pigeonhole sortまたはcounting sort、およびPukku で言及されている基数ソート。
基数ソートを見てください。
人々が「ソート アルゴリズム」と言うとき、「比較ソート アルゴリズム」を指していることがよくあります。これは、「これはそれよりも大きいか小さいか」を尋ねることができることのみに依存するアルゴリズムです。したがって、データについてこの 1 つの質問をすることに制限されている場合、n*log(n) を超えることはありません (これは、データ セットの n 階乗の可能な順序付けの log(n) 検索を実行した結果です)。 .
「比較ソート」の制約を回避し、データの一部についてより洗練された質問をすることができれば、たとえば「このデータの基数 10 は何ですか」など、線形時間ソート アルゴリズムをいくつでも思いつくことができます。より多くのメモリを必要とするだけです。
これは時間空間のトレードオフです。比較ソートは RAM をほとんどまたはまったく必要とせず、N*log(n) 時間で実行されます。基数ソート(たとえば)は、O(n)時間AND O(log(基数))メモリで実行されます。
n=2 で数値が一意の場合は、非常に簡単です。
複雑さ => O(2n)
それ以外の場合は、基数ソートを使用します。
複雑さ => O(kn) (できれば)
ウィキペディアには、非常に多くの異なる並べ替えアルゴリズムとその複雑さが示されています。あなたはそれらをチェックアウトしたいかもしれません
数値は、各桁が 0 から n-1 までの 3 桁の数値と考えてください。これらの数値を基数ソートでソートします。桁ごとに、合計実行時間が Theta(n) に対応するように、Theta(n+n) 時間かかるカウント ソートの呼び出しがあります。
限られた範囲の数値のセットは、RANGE ビットのビットマップで表すことができます。この場合、500 MB のビットマップなので、巨大なリスト以外の場合は、Radix Sort を使用したほうがよいでしょう。数値 k に遭遇したら、bitmap[k] = 1 に設定します。リストを 1 回トラバーサルする O(N)。
同様のアルゴリズムが可能です:
M;// unsorted array
lngth; //number items of M
for(int i=0; i < lngth; i++)sorted[M[i]];
線形の複雑さのための唯一の可能なアルゴリズムですが、ram (N - 配列要素の数、k -- 要素の len) ごとに O(k*N) の複雑さがあります。