基数ソートのC ++実装

バケットソート  

  基数ソートの前にいえば、バケットソートについて話す、両方の大きな関連性を持つことになります。

  バケットソートの順序は、例えば、整数Nで、Nは1〜M(0〜M-1あまりにも)の範囲の整数、あなたは配列COUNTを作成することができ、サイズは、最初のすべての要素Mであります0に初期化され、各要素は、アレイは、M個のバレルを有する、バレルと呼ばれています。次に数字の順序集合にクロックされ、それは数Aを読み出すことが想定され、COUNTに対応する配列要素[A]プラス1の値、即ち、バケット記録されたデータバケットの落下の数。、非0バケットインデックス(カウント[インデックス]が何回出力)の出力シーケンスを読んだ後、データのデータ出力がソートされます。

  9つのデータ、好ましくはM = 10(10のアレイサイズ)の最大値が確立するので、例えば6つの9,3,1,1,0,5バケットソートデータ、アレイの確立、アレイカウントが[10]、データが読み出され、第9読み取り、カウント[9] = 1、3が読み出され、カウント[3] = 1、...カウント[1] = 2、......というように、 [10] = {1,2,0,1,0,1,0,0,0,1}カウント、読んだ後に、配列内のいくつかの要素が0である、数値出力に対応するデータが0でありません、要素が何回出力された出力が正しくソートされた、0,1,1,3,5,9です。

基数ソート

  データはバケットがバケットソートの複数のパスを使用するので、あまり必要になりすぎると基数ソート、プロモーションのバケットソートです。どのようにマルチパス方式、方法は、一連のデータを想定し、優先度の低いバケットソート(も高い優先)であります

73、22、93、43、55、14、28、65、39、81
数値の最初の桁は、数値が0〜9の番号が付けバケットに割り当てることにより、訪問しました:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

第二のステップ

次に、これらのバケットの値は、以下の一連なり、直列に再接続されています。
81、22、73、93、43、14、55、65、28、39
その後、別の割り当てを行う、この時間は数十に応じて割り振られます。
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93

第三段階

次に、これらのバケットの値は、以下の一連なり、直列に再接続されています。
14、22、28、39、43、55、65、73、81、93
今回はシリーズ全体がソートされている、オブジェクトが複数の3桁を命じた場合、最大桁数まで、上記のアクションまで続きました。
 
達成するためのC ++コード
#include " pch.h " 
の#include <iostreamの>
 使用して 名前空間STD; 

int型(maxbit INTデータ[]、INT n-は)// データの組のビットの最大数を見つける
{
     int型のカウント= 1 ;
     INT D = 0 ;
     INT I = 0、I <N - 、I ++ 
    { 
        int型の TEMP = DATA [I];
         一方、(TEMP / 10!= 0 
        { 
            COUNT ++; 
            TEMP = TEMP / 10 ; 
        } 
        IF(D < COUNT)
            D = COUNT; 
        COUNT = 1 ; 
    } 
    リターンD; 
} 
ボイド基数ソート(INTデータ[]、INT N-)// 基数ソートのために
{
     INT D = maxbit(データ、N-);     // ビットの最大数、すなわち、バケットソートのためのD倍得る
    INT * TMP = 新しい新しい INTを [N-];         // スペースtmpが各バケットソート後のデータポイントを格納するために使用される
    INT * COUNT = 新しい新しい int型[ 10 ];     // 各バケットの桁数を指すようにCOUNTストレージバケット後に立ち下がるソート
    
    値int =基数を1。;
     INT J、K;
     のためINT I = 1 ; I <= D; I ++ 
    { 
        INT I = 0 ; I < 10 ; I ++ 
            COUNT [I] = 0 ;             // 浴槽前のそれぞれの割り当てられたデータが0に初期化されるたびに
        するためにINT I = 0、I <N - 、I ++)// スケジューリングのためのDで
        { 
            K =(データ[I] /基数)%10 ; // ビットを見つける(もの、数十、数百は...)何個々のデータで 
            、COUNT [K] ++ //はバケットデータを対応するプラス1、多くのカウントがバレルを置くか、あります
        }
         ため(= J 1、J < 10 ; J ++)// オブジェクトは、バレル空間tmpにデータに順次データをいうどの解決することである 
            [J] COUNT = COUNTを- [J 1。 +] COUNT [J]。
         INT I = N- 1、I> = 0 ; i--)// データ内のデータが順にソートTMP空間、データは後ろから再生を開始することに注意してください示し
        { 
            K =(データ[ I] /基数)%10 ; 
            TMP [COUNT [K] - 1 ] =データ[I]、
            COUNT [K] - ; 
        } 
        ためINT I = 0、I <N - 、I ++)// 各バケットにデータソートデータ 
            データ[I] = TMP [I]; 
        基数 = * 10 ; 
    } 
    削除 [] TMP; // メモリ解放
    削除 [] COUNT; // 解放メモリ
} 

INT )(主に
{ 
    INTデータ[ 10 ] = { 73であり22は9343は551428653981 }; 
    基数ソート(データ、10 );
     のためのINT I = 0 ; I < 10 ; I ++)// 出力データが配列ソート 
        COUTを<<データ[I] << "  " 
    システム(" PAUSE " );
     戻り 0 ; 
}

結果:

 

 

 

おすすめ

転載: www.cnblogs.com/cs0915/p/12119023.html