当前位置:首页 其他 > 正文

C++编程用桶排序算法:输入n 个0到100之间的整数,由小到大排序输出

作者:野牛程序员:2023-03-02 14:25:07 其他阅读 2917

C++编程用桶排序算法:输入n 个0到100之间的整数,由小到大排序输出


以下是使用 C++ 编写的桶排序算法实现:

#include <iostream>
#include <vector>
using namespace std;

// 桶排序函数
void bucketSort(vector<int>& arr) {
    const int max_num = 100;  // 数据的最大值
    const int bucket_size = max_num + 1;  // 桶的大小
    vector<int> buckets(bucket_size, 0);  // 初始化桶

    // 将元素放入对应的桶中
    for (int i = 0; i < arr.size(); i++) {
        buckets[arr[i]]++;
    }

    // 将所有桶中的元素按顺序放回原数组
    int arr_index = 0;
    for (int i = 0; i < bucket_size; i++) {
        while (buckets[i]-- > 0) {
            arr[arr_index++] = i;
        }
    }
}

int main() {
    int n;
    cout << "请输入数字个数 n:";
    cin >> n;

    vector<int> arr(n);
    cout << "请输入 n 个0到100之间的整数:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    bucketSort(arr);

    cout << "排序后的数组为:" << endl;
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

该程序首先读入数字个数 n 和 n 个整数,然后使用桶排序算法将这些数排序,最后输出排序后的数组。桶的大小是 101,其中第 i 个桶表示数字 i 出现的次数。算法的时间复杂度为 O(n + k),其中 k 为桶的大小,因为对每个元素只需要进行一次桶的插入和一次桶的读取,所以该算法的效率很高。


buckets[arr[i]]++;是什么意思 ?为什么要++?


这里的  是将  对应的桶的计数器加 1 的操作。buckets[arr[i]]++arr[i]

在桶排序算法中,我们首先需要确定桶的数量和桶的范围,然后遍历待排序数组中的每个元素,并将它们分别放入对应的桶中。放入桶中的元素可以使用桶的计数器来计数,也可以使用链表或数组等数据结构来存储。

对于每个桶中的元素,我们可以使用插入排序等算法对它们进行排序,然后按照桶的顺序依次将所有桶中的元素合并到一起,即可得到排序后的结果。

因此,在桶排序中,我们需要使用计数器来记录每个桶中元素的数量,这样才能保证在将所有桶中的元素合并时,它们可以按照正确的顺序被输出。在  这行代码中,我们将  对应的桶的计数器加 1,这样就可以记录该桶中元素的数量了。buckets[arr[i]]++arr[i]


buckets[i]-- > 0 是什么意思


在桶排序算法的最后一步,我们需要将所有桶中的元素按照顺序依次放回原数组中。由于每个桶中的元素可能有多个,而且它们的顺序可能不是我们想要的顺序,因此我们需要遍历所有桶中的元素,并按照顺序依次将它们放回原数组中。

在这个过程中,我们需要判断桶中是否还有元素,如果有,则将桶中的第一个元素取出来放回原数组中,并将该桶的计数器减 1。如果桶中还有其它元素,则继续取出第一个元素放回原数组中。直到该桶中没有元素为止。

因此,在  这行代码中,我们首先判断桶  中是否还有元素,如果有,则将桶中的第一个元素取出来放回原数组中,并将该桶的计数器减 1。如果该桶中还有元素,则继续取出第一个元素放回原数组中。直到该桶中没有元素为止。当该桶中的元素都被放回原数组后,我们就可以继续遍历下一个桶,直到所有桶中的元素都被放回原数组为止。while (buckets[i]-- > 0)


代码中没用 #include <vector> 实现的程序:

#include <iostream>
#include <cstring>

const int MAX_N = 100;

void bucket_sort(int arr[], int n) {
    int buckets[MAX_N + 1]; // 桶数组
    memset(buckets, 0, sizeof(buckets)); // 将桶数组全部初始化为 0

    for (int i = 0; i < n; i++) {
        buckets[arr[i]]++; // 将元素放入对应的桶中
    }

    int arr_index = 0;
    for (int i = 0; i <= MAX_N; i++) {
        while (buckets[i]-- > 0) { // 将桶中元素按顺序放回原数组
            arr[arr_index++] = i;
        }
    }
}

int main() {
    int n;
    std::cout << "请输入数组长度:";
    std::cin >> n;

    int arr[n];
    std::cout << "请输入" << n << "个0到100之间的整数:" << std::endl;
    for (int i = 0; i < n; i++) {
        std::cin >> arr[i];
    }

    bucket_sort(arr, n); // 进行桶排序

    std::cout << "排序后的数组为:";
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}


该代码使用一个长度为101的桶数组,下标代表元素值,值代表元素出现次数。首先将数组中的元素按照出现次数放入对应的桶中,然后按顺序将桶中的元素放回原数组。最终实现了对给定整数范围内的整数进行排序的功能。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击