目录原理实现步骤:模拟生成整数随机数桶排序实现完整版可运行程序时间复杂度计算桶排序:整数 原理 原理简述:按照需要排序数组的实际情况,生成一个一定长度的一维数组,用于统计
桶排序:整数
原理简述:按照需要排序数组的实际情况,生成一个一定长度的一维数组,用于统计需要排序数组的不同数值的重复次数,完成统计后,再按顺序重复输出该数值
#include <random>
#include <ctime>
// 传入空数组arr[]以及它的长度len,填入[min, max]区间内的随机整数
void getRand(int arr[], int len, int min, int max) {
std::default_random_engine e;
e.seed(time(0));
std::unifORM_int_distribution<int> u(min,max);
for (int i = 0; i < len; i++) arr[i] = u(e);
}
#include <climits>
void bucketSort(int arr[], int len) {
// 确定最大值和最小值
int max = INT_MIN; int min = INT_MAX;
for (int i = 0; i < len; i++) {
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
// 生成桶数组
// 设置最小的值为索引0,每个桶间隔为1
int bucketLen = max - min + 1;
// 初始化桶
int bucket[bucketLen];
for (int i = 0; i < bucketLen; i++) bucket[i] = 0;
// 放入桶中
int index = 0;
for (int i = 0; i < len; i++) {
index = arr[i] - min;
bucket[index] += 1;
}
// 替换原序列
int start = 0;
for (int i = 0; i < bucketLen; i++) {
for (int j = start; j < start + bucket[i]; j++) {
arr[j] = min + i;
}
start += bucket[i];
}
}
#include <iOStream>
#include <random>
#include <ctime>
#include <climits>
// 一些参数
const int MAX = 30;
const int LEN = 64;
void bucketSort(int arr[], int len);
void getRand(int arr[], int len, int min, int max);
int main() {
int arr[LEN] = {0};
// 产生随机值
getRand(arr,LEN,0,MAX);
// 打印随机值
std::cout << "Before sorted:" << std::endl;
for (int i : arr) {
std::cout << i << " ";
}
std::cout << "" << std::endl;
// 排序
bucketSort(arr,LEN);
// 打印输出值
std::cout << "After sorted:" << std::endl;
for (int i : arr) {
std::cout << i << " ";
}
}
void getRand(int arr[], int len, int min, int max) {
std::default_random_engine e;
e.seed(time(0));
std::uniform_int_distribution<int> u(min,max);
for (int i = 0; i < len; i++) arr[i] = u(e);
}
void bucketSort(int arr[], int len) {
// 确定最大值和最小值
int max = INT_MIN; int min = INT_MAX;
for (int i = 0; i < len; i++) {
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
// 生成桶数组
// 设置最小的值为索引0,每个桶间隔为1
int bucketLen = max - min + 1;
// 初始化桶
int bucket[bucketLen];
for (int i = 0; i < bucketLen; i++) bucket[i] = 0;
// 放入桶中
int index = 0;
for (int i = 0; i < len; i++) {
index = arr[i] - min;
bucket[index] += 1;
}
// 替换原序列
int start = 0;
for (int i = 0; i < bucketLen; i++) {
for (int j = start; j < start + bucket[i]; j++) {
arr[j] = min + i;
}
start += bucket[i];
}
}
结果
分析算法步骤:
总时间复杂度为 O(3*len + 2*bucketLen) .
P.S. 浮点型的桶排序,由于考虑到每个桶之间区间间隔难以确定、每个桶内储存的值数量不定等情况,笔者目前尚无法通过基础的c++运算来实现,使用一些高级功能又怕时间复杂度爆炸,最终得不偿失,不如转而研究其他类型的排序方法更值得。如果有大佬写出来浮点型桶排序,可以评论或者私信我,感谢!
** 参考书籍:啊哈!算法
到此这篇关于C++ 实现桶排序的示例代码的文章就介绍到这了,更多相关C++ 桶排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++ 实现桶排序的示例代码
本文链接: https://www.lsjlt.com/news/130306.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0