桶排序适用于元素分布均匀的情况。
#include <bits/stdc++.h>
using namespace std;
double minx, span, maxx;
// 区间跨度 = (最大值 - 最小值) / (桶的数量 - 1)
void calSpan(vector<double>& a) {
maxx = a[0], minx = a[0];
for (int i = 1; i < a.size(); i++) {
if (a[i] > maxx) {
maxx = a[i];
}
if (a[i] < minx) {
minx = a[i];
}
}
span = (maxx - minx) / (a.size() - 1);
}
// 桶排序
void bucketSort(vector<double>& a) {
calSpan(a);
int bucketNum = a.size(); // 桶的数量等于原始数列的元素数量
vector<double>b[bucketNum];
// 遍历原始数组,将每个元素放入桶中
for (int i = 0; i < a.size(); i++) {
int index = (a[i] - minx) / span;
b[index].push_back(a[i]);
}
// 对每个桶内部进行排序
for (int i = 0; i < bucketNum; i++) {
sort(b[i].begin(), b[i].end());
}
// 遍历所有的桶,输出所有元素
int k = 0;
for (int i = 0; i < bucketNum; i++) {
for (int j = 0; j < b[i].size(); j++) {
a[k++] = b[i][j];
}
}
}
int main() {
system("chcp 65001");
vector<double>a{ 1,255,8,6,25,47,14,35,58,75,96,158,657 };
cout << "原始数组:\n";
for (int i = 0; i < a.size(); i++) {
cout << a[i] << " ";
}
cout << endl;
bucketSort(a);
cout << "排序后:\n";
for (int i = 0; i < a.size(); i++) {
cout << a[i] << " ";
}
return 0;
}