ソートアルゴリズム - バケットソート

序文

バケットソート(バケットソート)またはいわゆるボックスソートソートアルゴリズムであり、原理は、アレイのバケットの限定された数に割り当てられます。最終的には個々のバケット、その後、ソートされた(再使用または他のソートアルゴリズムを再帰的にソートソートバケツを継続して使用することが可能である)、およびは、順序付けられたシーケンスを覚えておくことが、個々のバケットリストを記録するためにオンにします。バケットソートをまとめ、結果の並べ替えの分類整理です。ソートする配列の値が均等に分散されたときに、バケットソート線形時間(Θ(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]
 

おすすめ

転載: www.cnblogs.com/WindSun/p/11361055.html