2017-10-26 4 views
0

「インプレース」反復LSD n-radixソートを実装することは可能ですか?明確にするには:wikipedia atricle in-place MSD基数ソートを読んだことがあります。「インプレース」反復LSD n-radixソート

カウントソートは、各ビンのサイズと開始インデックスを決定するために使用されます。

したがって、インデックスを格納するためには補助配列が必要ですが、それでも必要なものがあれば、それはまだインプレースアルゴリズムとみなされます(この配列はn-基数ソート)。また、再帰MSD基数ソートが実装されているthis answerも読んでいます。これには、n-radixソートの一般的な実装もありません。

+0

通常の場合、2つの補助配列、または1つのペアの配列が必要です。各ビンには開始インデックスと要素の動的カウントが必要です(カウントはゼロから始まり、要素がビンに格納されると増加します)。 wikiの記事で述べているように、配列のスキャンは、ビンに既に格納されている要素をスキップする必要があります。 – rcgldr

答えて

0

はい。入力データを事実上いくつかのサイズのページに分割します(4KBはうまく機能します)。次に、データを消費したときにこれらのページを再利用します。あなたはしかし、いくつかの余分なメモリが必要になります - 最初のバケットのnページまで、次ページ・ポインタ(1ページに1つのポインタ)、3 * n個のポインタをhead_page/CURRENT_PAGE/current_write_ptr用バケット

あたりのアルゴ:

  1. 空きページのリストに入れて、空きページのリストに入れます。
  2. エントリをバケットに移動します。入力データのページ全体が処理されたら、このページを空きページのリストに追加します。バケットページ全体が満たされたら、このバケットページのリストに追加し、空きリストから新しいバケットページを割り当てます。あなたがあれば、バケットもちろん​​

のために、元の配列に、それに合わせて部分的に

  • 移動データの周囲に充填されたこのリスト内の各bicketあたりのページのリスト、最後のページになってしまいます複数のLSDパスが必要な場合は、最後のパスを除いてステップ3をスキップし、ステップ2で作成したリストから直接各ソートパスを開始することができます。ただし、余分なページが必要になります。

  • +0

    実際にこの場合のページとバケットの違いは何ですか?より正確にはページとは何ですか? –