今天了解了桶排序算法
时间复杂度:
平均时间复杂度: O(n + k),其中 n 是数据的数量,k 是桶的数量。
最坏时间复杂度: O(n^2),当所有数据都分配到同一个桶中时。
空间复杂度: O(n + k),需要额外的空间来存储桶和数据。
2. 算法步骤
初始化桶: 根据数据的范围创建一定数量的桶。
分配数据: 将每个数据分配到相应的桶中。
排序桶内的数据: 对每个桶内的数据进行排序(可以使用插入排序、快速排序等)。
合并桶: 将所有桶中的数据按顺序合并,得到有序序列。
include
include
include // For std::sort
// 桶排序函数
void bucketSort(float arr[], int n) {
if (n <= 0) return;
// 1. 创建桶
std::vector<float> buckets[n];
// 2. 将数据分配到桶
for (int i = 0; i < n; ++i) {
int bucketIndex = static_cast<int>(n * arr[i]); // 确定桶的位置
if (bucketIndex >= n) {
bucketIndex = n - 1; // 确保索引不会越界
}
buckets[bucketIndex].push_back(arr[i]); // 将元素添加到相应的桶中
}
// 3. 对每个桶内的数据进行排序
for (int i = 0; i < n; ++i) {
std::sort(buckets[i].begin(), buckets[i].end());
}
// 4. 合并所有桶中的数据
int index = 0;
for (int i = 0; i < n; ++i) {
for (size_t j = 0; j < buckets[i].size(); ++j) {
arr[index++] = buckets[i][j]; // 将数据从桶中取出并放入原数组
}
}
}
int main() {
float arr[] = {0.42, 0.32, 0.33, 0.52, 0.37, 0.47, 0.51};
int n = sizeof(arr) / sizeof(arr[0]);
bucketSort(arr, n);
// 打印排序后的数组
std::cout << "Sorted array: ";
for (int i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
标签:总结,arr,int,buckets,++,今日,排序,数据 From: https://www.cnblogs.com/wjhfree/p/18456995