C++编程用桶排序算法:输入n 个0到100之间的整数,由小到大排序输出
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的桶数组,下标代表元素值,值代表元素出现次数。首先将数组中的元素按照出现次数放入对应的桶中,然后按顺序将桶中的元素放回原数组。最终实现了对给定整数范围内的整数进行排序的功能。
