排序之桶排序--C++

30 阅读2分钟

步骤

桶排序(Bucket Sort),又称为箱排序,是一种线性时间复杂度的排序算法,适用于处理分布较为均匀的数据。它的基本思想是将数据分布到有限数量的桶里,每个桶分别进行排序,然后按顺序将各个桶中的元素合并。以下是桶排序的基本步骤:

  1. 确定桶的数量

    • 首先,需要确定桶的数量,这通常取决于输入数据的范围和分布。桶的数量可以基于数据的最大值和最小值来设置,以确保数据在桶之间尽可能均匀分布。
  2. 初始化桶

    • 创建一系列空桶,每个桶用于存放特定范围的元素。通常,桶可以是数组或列表的形式。
  3. 分配数据到桶中

    • 遍历输入数据,将每个元素分配到对应的桶中。分配的依据是元素的值,例如,可以通过取模运算或除以桶的数量来确定元素应该放入哪个桶。
  4. 对每个桶中的元素进行排序

    • 对于每个桶中的元素,可以使用其他排序算法(如插入排序、快速排序等)进行排序,或者如果桶中的元素数量较少,可以直接使用简单的比较和交换操作进行排序。
  5. 合并桶中的元素

    • 一旦所有的桶都被排序,就需要将它们合并成一个有序的序列。这通常通过遍历每个桶并将元素依次添加到结果数组的末尾来完成。
  6. 处理边界情况

    • 如果输入数据中有元素恰好等于桶的边界值,可能需要特殊处理以确保排序的正确性。
  7. 返回排序结果

    • 最后,返回合并后的有序数组作为排序结果。

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 桶排序函数
void bucketSort(vector<int>& arr) {
    int n = arr.size();
    if (n == 0) return;

    // 找到最大值,用于确定桶的数量
    int maxVal = *max_element(arr.begin(), arr.end());
    int bucketSize = 10; // 可以根据实际情况调整桶的大小

    // 创建桶,这里使用vector的动态特性
    vector<vector<int>> buckets(maxVal + 1);

    // 将数组中的元素分配到各个桶中
    for (int num : arr) {
        int index = num / bucketSize;
        buckets[index].push_back(num);
    }

    // 对每个桶进行排序,这里使用了STL中的sort函数
    for (auto& bucket : buckets) {
        sort(bucket.begin(), bucket.end());
    }

    // 合并桶中的元素
    int idx = 0;
    for (auto& bucket : buckets) {
        for (int num : bucket) {
            arr[idx++] = num;
        }
    }
}

// 主函数
int main() {
    vector<int> arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    cout << "原始数组: ";
    for (int num : arr) {
        cout << num << " ";
    }
    cout << endl;

    bucketSort(arr);

    cout << "桶排序后的数组: ";
    for (int num : arr) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}