序文
バケットソート(バケットソート)またはいわゆるボックスソートソートアルゴリズムであり、原理は、アレイのバケットの限定された数に割り当てられます。最終的には個々のバケット、その後、ソートされた(再使用または他のソートアルゴリズムを再帰的にソートソートバケツを継続して使用することが可能である)、およびは、順序付けられたシーケンスを覚えておくことが、個々のバケットリストを記録するためにオンにします。バケットソートをまとめ、結果の並べ替えの分類整理です。ソートする配列の値が均等に分散されたときに、バケットソート線形時間(Θ(n)を)使用します。しかし、バケットソートのソート比較しないで、彼はOに影響されない下限(N Nを記録)。
基本的な考え方
除算のバケットソートを考えると、ほぼ完全な思考を征服します。
バケットソートは、独立均一範囲に分布しており、この範囲は、複数のサブ範囲(浴槽)に分割されている一組にソートされているものとします。
次いで、マッピング関数Fに基づいて、鍵kをソートする列はバケット(即ち、添字IのバケットアレイB)i番目にマッピングされ、その要素として鍵kは、Bする[I](あたりでバケットは、B [i])とサイズN / M系列のグループです。
各バケットB [I]中のすべての要素のソート比較(高速放電を使用することができる):合成データは、アップ各浴槽に順序付けされます。列挙出力B順序付けられたシーケンスにある[0] ... .B全体[M]が続きます。
注:マッピング関数は、一般的にF =配列[I] / Kであり、k ^ 2 = nであり; nは、すべての要素の数であります
より効率的なバケットソートを行うために、我々は2つのことを実行する必要があります。
十分な追加の空き状況の場合には、バケットの数を最大化
マッピング関数の均一な分布は、KのN浴槽にデータを入力するために使用することができます
同時に、バケットの要素をソートするため、影響は性能にとって重要である比較するソートアルゴリズムを選択します。
実装ロジック
空のバケツなどの量的配列を設定します。
検索順序、およびに対応するバケットに投影します。
それぞれのバケットソートを空にしません。
家から空樽プロジェクト、その後、元のシーケンスにありません。
ショー
ステップにより示さステップ:配列が配列= [63、157、189、51、101、47、141、121、157、156、194、117、98、139、67、133、181、13、28を有し、 109]、そのバケットソート:
アルゴリズムコード
ここでは主にアイデアの表現にバケツソートを容易にするため、ベクターの使用は、単一バケットはまた、ソートSTLを使用しました
1 // 桶排序 2 空隙バケットソート(INT * ARR、int型N) 3 { 4 INT最大=のARR [ 0 ]。 5 のための(int型 i = 1 ; iが<N; iが++ ) 6 { 7 場合(ARR [I]> MAX) 8 最大=のARR [I]。 9 } 10 ベクター< 整数 > *バケット= 新しいベクトル< INT > [最大/ 10 + 1 ]。 11 以下のために(int型 I = 0 ;私は<N-; I ++の) 12は 、{ 13は int型の変更=のARR [I] / 10 ; // バケット番号要素ARR [i]が配置されている 14 バケット[変更] .push_back(ARR [i])と; 15 } 16 のために(INT I = 0、I <N - 、I ++ ) 17 { 18は、 IF(バケツ[I] .size()> 0 ) 19 { 20は 並べ替え(バケツ[I] .begin()、バケツ[I ] .END()); // バレルソート 21 } 22 } 23が INTインデックス= 0 ; 24 用の(int型 I = 0、I <N - 、Iは++)// トラバース槽 25 { 26である ため(INT J = 0 ; J <バケット[I] .size(); J ++)// トラバースバレル素子 27 { 28 ARR [インデックス++] = バケット[I]、[J]; 29 } 30 } 31です }
アルゴリズム分析
- 平均時間計算量:O(N + K)
- 最高の時間複雑度:O(N + K)
- 最悪時間計算量:O(N ^ 2)
- 宇宙複雑:O(N * K)
- 安定性:安定
他の部分の時間複雑度はO(N)であるので、最良の場合のバケットソートに線形時間O(n)が、バケットソート時間計算を使用して、とは、それぞれのバケットソート時間複雑さとの間のデータに依存します。もちろん、バケットパーティション小さく、それぞれのバケット間のデータが少ない時間は少ないソートするために使用されます。しかし、対応する領域の消費量が増加します。
[参考ます。https://blog.csdn.net/developer1024/article/details/79770240]