シーケンシングを数える(カウント並べ替え)
比較要素に基づいて発注を計数が、配列インデックスを使用して要素の正確な位置を決定するためのアルゴリズムされません。入力キーのコア値はオープンで、追加の空間に、配列に格納された配列決定データをカウントします。(kは、範囲内の整数である)、アルゴリズムはO(n + k)をソーティングする際の複雑さをカウントする線形ソート時間複雑。
jは簡単な説明であり、積分空間は、入力された整数nの要素は、0とkとkよりも大きい長さを確立するためにアレイに等しい場合。ように、アレイのより大きな長さを確立すること、の範囲で決定されます 配列内のインデックス位置の各値が表示される配列に対応する時間の整数を表します。統計結果によると、直接配列を介して、出力要素の配列インデックス値は、要素がいくつかの値であり、それは出力の数倍です。
シンプルな実装:
クラス解決 { パブリック: ボイド coutSort(INT *データ、int型の長さ) { IF(データ==長nullptr || <= 0 ) リターン; //が列の最大数を決定する int型マックス= DATA [ 0 ]; のための(INT I = 。1 ; Iは<長さ; ++ I) { IF(データ[I]> MAX) 最大 = データ[I]; } // 統計的配列の長さを決定し、初期化 INT * = coutDataを新しい新しい INT [+最大1。]; のため(int型 I = 0を、私は=最大の<; ++ I)は coutData [I] = 0 ; // 反復、表示された各回数をカウント するために(int型私は= 0を。 ++; Iは長さ< I) ++ coutData [データを[I]は]; // ソートされた配列、いくつかがなされてきたいくつかの、出力に蓄積されたデータに、その後数回 のintインデックス= 0 ; のための(INT I = 0 ;私は=最大<; ++ I)の { ため(INTJ = 0 ; J <coutData [i]は、++ J) { データ[インデックス ++] = I。 } } } }。
最適化されたバージョン(安定ソート):
(1)最大及び最小の要素でソートする配列を同定します
(2)I、i番目の項目に現れるそれぞれのアレイ要素値が配列Cに格納された回数をカウント
(3)すべての累積カウント(第1の素子Cから出発して、前面と和の各)
(4)充填された出力配列を逆に各要素の新しい配列C(i)の各要素に、私は1を減算C(i)を置かれます
クラス解決 { パブリック: INT * coutSort(INT *データ、int型の長さ) { 場合(データ== nullptr ||長さ<= 0 ) 戻りnullptr。 // 确定数列最大值 int型の最大=データ[ 0 ]; INT分=データ[ 0 ]。 以下のために(int型 i = 1 ; iは<長さ; ++ I) { 場合(データ[I]> MAX) 最大 = データ[I]; IF(データ[I] < 分) 分 = DATA [I]; } int型 - D =最大、最小 // 統計的配列の長さを決定し、初期化 INT * = coutData 新しい新しい INT [Dの+を1 ]; のための(INT I = 0 ;私は= D <; ++ I) coutDataを[I] = 0 ; // 反復、各出現回数をカウント するための(int型 I = 0を Iは、長さを<; ++ I)は ++ coutData [データ[I] - 分]; //変形、統計のアレイは、後者の要素は、上記の要素の和に等しい ため(INT I = 1 ; ++;私は= D < I) coutData [I]は + = coutData [I - 1 ]; // 逆方向移動元のシリーズを、アレイからの統計正しい位置、結果アレイの出力見つける INT * = sortedArray 新しい新しい INT [長さ]; のための(int型私は=長さ- 1。 ; I> = 0 ; i-- ) { sortedArray [coutData [データ[I] -分] - 1 ] =データ[I]; //はcoutDataデータの対応する値を検索[i]は、数値どの程度元の順序を示す(初めからようので、マイナス1) coutData [データ[I] -分] - ; // その後、対応coutDataの値マイナス1は、次の出会いにこの値を表し、元の順序です。 } 戻りsortedArray; } }。
テストの最適化されたバージョン:
ボイド試験() { int型のデータは[] = { 95、98、97、90、98、93、92、91 }。 int型の長さ= はsizeof(データ)/ はsizeof(INT )。 ソリューションM; INT *配列= M.coutSort(データ長)。 以下のために(int型 i = 0 ; iは長さ<; ++ I) COUT <<配列[I] << " " 。 coutの <<endl; }
制限事項:
配列ギャップの最大値と最小値は、シーケンシングをカウントするのに適した、大きすぎない1。また、増加した空間と時間の複雑さの無駄になります。
前記アレイ素子は、少数のような整数、シーケンシングをカウントするのに適していないではありません。