温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++怎么实现桶排序

发布时间:2022-03-28 10:25:01 来源:亿速云 阅读:173 作者:iii 栏目:大数据

本篇内容主要讲解“C++怎么实现桶排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现桶排序”吧!

原理

原理简述:按照需要排序数组的实际情况,生成一个一定长度的一维数组,用于统计需要排序数组的不同数值的重复次数,完成统计后,再按顺序重复输出该数值

实现步骤:

  • 确定需要排序数组的最大值和最小值

  • 生成桶数组,并初始化

  • 对需要排序数组进行统计,统计结果放入相应的桶中

  • 循环输出桶,并替换原序列

模拟生成整数随机数

#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];
    }
}

结果 

C++怎么实现桶排序

时间复杂度计算

分析算法步骤:

  • 确定需要排序数组的最大值和最小值 - 循环len次

  • 生成桶数组,并初始化 - 循环bucketLen次

  • 对需要排序数组进行统计,统计结果放入相应的桶中 - 循环len次

  • 循环输出桶,并替换原序列 - 循环bucketLen+len次

总时间复杂度为 O(3*len + 2*bucketLen) .

P.S. 浮点型的桶排序,由于考虑到每个桶之间区间间隔难以确定、每个桶内储存的值数量不定等情况,笔者目前尚无法通过基础的C++运算来实现,使用一些高级功能又怕时间复杂度爆炸,最终得不偿失,不如转而研究其他类型的排序方法更值得。如果有大佬写出来浮点型桶排序,可以评论或者私信我,感谢!

到此,相信大家对“C++怎么实现桶排序”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI