質問

[0..n^3-1] の範囲の n 個の整数の入力セットを指定して、線形時間ソート アルゴリズムを提供します。

これは木曜日のテストの復習なのですが、この問題にどう取り組んでいいのかわかりません。

役に立ちましたか?

解決

また、あまりにも、関連の種類を見てみましょう:ソートの分類整理や<のhref = "HTTP ://en.wikipedia.org/wiki/Counting_sort」のrel = "noreferrer">ソートを数えるだけでなく、<のhref = "http://en.wikipedia.org/wiki/Radix_sort" のrel =ソートする Pukkuで述べたように "noreferrer">基数ます。

他のヒント

基数ソートするを見てください。

人々は「それよりも、この事が大きくなったり小さくなって」頼むことができることに依存して任意のアルゴリズムである、彼らはしばしば「比較ソートアルゴリズム」を参照している「アルゴリズムをソートする」と言うとき。あなたがデータについては、この一つの質問を尋ねるに限定されているのであれば、あなたは(これは、ログデータセットのn個の階乗の可能な順序付けの(n)の検索をすることの結果である)n * log(n)のより多くを得ることはありません。

あなたは「ソート比較」の制約を逃れ、「このデータのベース10基数あるもの」例えば、データの一部について、より洗練された質問をすることができた場合は、

あなたは線形時間の任意の数を思い付くことができますアルゴリズムを並べ替え、彼らはより多くのメモリを取ります。

これは、時間空間のトレードオフです。 Comparasonソートは、ほとんど、あるいはまったくラムを取り、N * log(n)の時間で実行されます。 (例えば)基数ソートはOで(N)時間とO(対数(基数))メモリを実行します。

ウィキペディアにはかなり多くの異なるソートアルゴリズムとその複雑さを示しています。あなたがそれらをチェックアウトする場合があります。

n=2 で数値が一意の場合、これは非常に簡単です。

  • ビットの配列を構築します (2^31-1 ビット => ~256MB)。それらをゼロに初期化します。
  • 入力を読み取り、表示される値ごとに、配列内のそれぞれのビットを 1 に設定します。
  • 配列をスキャンし、ビットセットごとにそれぞれの値を出力します。

複雑さ => O(2n)

それ以外の場合は、基数ソートを使用します。

複雑さ => O(kn) (できれば)

各桁が0からN-1の範囲にある3桁の番号として数字を考えます。基数ソートでこれらの番号を並べ替えます。総実行時間はシータ(N)に対応するように各桁のシータ(N + N)を取っているソートカウントへの呼び出し時間がある。

数の限られた範囲の設定はRANGEビットのビットマップで表すことができます。 この場合は、500メガバイトのビットマップなので、巨大なリストが、何のために、あなたは基数ソートとしたほうが良いと思います。リストを通じて、設定ビットマップ[K] = 1.シングルトラバーサルを数kが発生するように、O(N)。

似アルゴが可能です:

M;// unsorted array
lngth; //number items of M
for(int i=0; i < lngth; i++)sorted[M[i]];

これは、単独で、線形複雑度の可能ALGOだが、それは、ラムによって複雑性O(k * N)を有する(N - 番号の配列要素、K - 要素のLEN)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top