まず、バケットソートは何ですか
バケットソート(バケットソート)またはいわゆるボックスソートソートアルゴリズムであり、原理は、アレイのバケットの限定された数に割り当てられます。各個別のバケット、その後、ソートされた(再帰的にソートソートバケットを使用して引き続き再使用または他のソートアルゴリズムをすることが可能です)。
バケット要素を注文するために、パフォーマンスのために重要な比較するソートアルゴリズムを選択します
第二に、実装
- 空のバケツなどの量的配列を設定します。
- シーケンスを検索し、対応するバケット内に突出します。
- それぞれのバケットソートを空にしません。
- 家から空樽プロジェクト、その後、元のシーケンスにありません。
第三に、例を達成するために
擬似コード:
function bucket-sort(array, n) is
buckets ← new array of n empty lists
for i = 0 to (length(array)-1) do
insert array[i] into buckets[msbits(array[i], k)]
for i = 0 to n - 1 do
next-sort(buckets[i])
return the concatenation of buckets[0], ..., buckets[n-1]
バケット内元素分布:
バケット内元素分布:
*ウィキからhttps://zh.wikipedia.org/wiki/バケットソート
第四に、バケットソートの性能パラメータ
1、時間の複雑さ
最悪時間計算量:
平均時間の複雑:
の時間複雑さ:
2、スペースの複雑さ
最悪のスペースの複雑さ:
3、安定しています
安定しました
図4に示すように、ストレージの任意の適切なタイプ
シーケンシャルストレージおよびストレージ・チェーン
第五に、コードの実装
サブバレルを使用する原理シンプルなポイントバレル
上のポイントバレルの削減書く時間...
*からの基準のアルゴリズム部
https://www.geeksforgeeks.org/bucket-sort-2/
から*バレル原理基準点
https://mp.weixin.qq.com/s/qq8-anybC8aYX5dnyrXmwA
アルゴリズムセクション
void bucketSort(int arr[],int len)
{
// 1 找到最大值
int max = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] > max)
max = arr[i];
}
// 2 找到最小值
int min = arr[0];
for (int i = 1; i < len; i++)
{
if (arr[i] < min)
min = arr[i];
}
// 3 根据最大值和最小值创建桶
int bucketNum = max/10 - min/10 + 1 ;
vector<int> b[bucketNum];
// 4 根据简单分桶,把元素放入桶中
for (int i = 0; i < len; i++)
{
int bi = (arr[i] - min )/10;
b[bi].push_back(arr[i]);
}
// 5 每个桶内单独排序
for (int i = 0; i < bucketNum; i++)
{
if (b[i].size() > 0) //当桶内元素大于0才排序
{
sort(b[i].begin(), b[i].end());
}
}
// 6 将桶内的元素放入arr中
int index = 0;
for (int i = 0; i < bucketNum; i++)
{
for (int j = 0; j < b[i].size(); j++)
{
arr[index++] = b[i][j];
}
}
}