基本排序算法 之九 ——桶排序

十大经典排序算法-桶排序算法详解 一、什么是桶排序 1.概念 桶排序(Bucket sort)是计数排序算法的升级版,将数据分到有限数量的桶子里,然后每个桶再分别排序 2.算法原理 这是一个无序数列:11、38、8、34、27、19、26、13,我们要将它按从小到大排序 先创建5个桶,桶的区间跨度=(最大值-最小值)/桶的数量,注意,每个桶的范围都是包含最小值,不包含最大值,最后一个桶,既包含最小值,也包含最大值 遍历原始序列,将序列放入桶中 每个桶内部的元素分别排序 遍历所有桶,将桶中元素依次输出:8、11、13、19、26、27、 阅读详情

 


基本排序算法总结与对比 之九  ——桶排序 


1、桶排序

       桶排序是对基数排序的演绎。计数排序是一个萝卜(相同的数)一个坑,而桶排序是几个萝卜(一定范围的数)一个筐。桶排序是将数据分到有限个桶中,然后对每个桶中的数据再排序(可能继续用桶排序,也可能用其他的排序方法)。

       那么要解决的问题是:

       ① 怎么划分桶?即 数据该划分为几个范围(分几个桶的问题),范围又要划分多大(分多大桶的问题)。

       ② 怎么实现桶?即 用什么容器来储存数。(链表,数组,甚至STL中的容器 都可以)。

       ③ 桶中的数据再排序用什么排序方法。(相机抉择吧)

       解决问题:

       ① 按照常见的一种方式,桶中数据的 范围 =(最大数 - 最小数 + 1)/ 桶的数量 。这种方法适用于数据分布比较均匀的数列,本文就采取这种方法。 还有其他的划分方式,比如前面的桶范围都一样,但最后一个桶范围特别大,适用于加数递增的数列,等等。

       ② 本文就选择 vector 作为容器,主要为了表示桶排序的思想。

       ③ 桶里面就使用std::sort()排序吧。

       

       排序过程解读:

       ① 找出数列中 最大,最小的数。

       ② 创建若干个桶;桶的范围则由:范围 =(最大数 - 最小数 + 1)/ 桶的数量 算出,范围取double,否则可能因为计算误差导致数据选择错误的桶,甚至可能选取一个不存在的桶 的编号 而造成程序崩溃。

       ③ 遍历待排序数组,将数据放进对应的桶;数据arr[k] 与 桶的编号 的映射关系为: 桶的编号 = (arr[k] - 最小数)/ 范围 ,显然数值越大,所在桶的编号越大。

       ④ 分别对每个桶内的数据排序。

       ⑤ 依次从桶中取出数据放回原数组。

 

       代码如下:

#include <vector>    //用 vector 做桶

//找出最大数
template<typename T>
T findMax(T arr[], int lo, int hi)
{
    T maxNum = *(arr + lo);
    while(++lo < hi)
    {
        if(*(arr + lo) > maxNum) maxNum = *(arr + lo);
    }
    return maxNum;
}

//找出最小数
template<typename T>
T findMin(T arr[], int lo, int hi)
{
    T minNum = *(arr + lo);
    while(++lo < hi)
    {
        if(*(arr + lo) < minNum) minNum = *(arr + lo);
    }
    return minNum;
}

template<typename T>
void bucketSort(T arr[], int lo, int hi)
{
    T maxNum = findMax(arr, lo, hi);
    T minNum = findMin(arr, lo, hi);

    std::vector<T> *buckets = new std::vector<T>[10];  //放有10个vector的数组
    double range = (maxNum - minNum + 1) / 10.0;    //随便分,这里分10个桶,注意范围取浮点数
    
    for(int i = lo; i < hi; i++)
    {
        buckets[(int)((arr[i] - minNum) / range)].push_back(arr[i]);  //对应范围的数放进桶里面
    }

    T *p = arr + lo;
    for(int i = 0; i < 10; i++)
    {
        std::sort(buckets[i].begin(), buckets[i].end());    //对桶里的数排序
        for(auto x : buckets[i])
        {
            *(arr++) = x;
        }
    }

    delete [] buckets;

}

       上述桶排序的时间复杂度:

       设 有M个桶,N个数,桶内排序方法的复杂度为O(nlogn):对于N个数,M个桶 则为N(log2N - log2M),将数据分类放进桶中复杂度为N;数据从桶中放回数组又为N。总共为O(2N+N(logN-logM))。

       桶排序本身的排序思维是稳定的,若桶内采用的排序算法依然稳定,则整个算法是稳定的。

 

基础排序算法 —— 桶排序 十大经典排序算法里面冒泡、插入、选择排序时间为O($n^2$),归并、快排、堆排序这些排序时间为O(nlogn),此外还有三种更快的排序算法为桶排序,基数排序,计数排序。后面这三种排序时间为O(n),因此也被称之为线性排序算法。桶排序一般是分这几步来操作:先定义一组或者说几个有序的“桶”使用映射函数将数组内的数据映射到各自对应的“桶”内在每个“桶”内进行排序(归并、插入、快排等等都可以)按顺序将每个”桶“内的数据依次取出,就可以输出一个有序的数组/数列。 阅读详情

相关推荐

[排序算法]--桶排序的Java实现

今天在刷leetcode的时候,在41题 First Missing Positive 发现了在排序算法中还有一个桶排序,顺便做个总结。 桶排序关于桶排序先做几点说明: 1)桶排序是稳定的; 2)桶排序是常见排序算法中最快的一种,大多数情况下比快排和归并排序还要快 3)桶排序非常快但是也非常消耗空间,典型的以空间换时间,基本上是最耗内存的一种排序算法。 桶排序中:无序数组有个要求,

惜暮 1万+

【算法】桶排序(Bucket Sort)详解

桶排序

qq_27198345的博客 4万+

【排序算法】图解桶排序

前言 在数据结构与算法的排序中,我们很多人可能更多的熟悉冒泡排序、快速排序、归并排序。可能对堆排序、桶排序、计数排数等比较生疏,其实这个也没啥复杂的,算法的排序中,我们很多人可能更多的熟悉冒泡排序、快速排序、归并排序。可能对堆排序、桶排序、计数排数等比较生疏,其实这个也没啥复杂的,桶排序是所有排序中最简单的排序之一。 没毛病老铁,就是最简单的之一。 桶排序思想 ...

bigsai 9938

排序算法之桶排序

桶排序桶排序时间复杂度是O(n+m+n(logn-logm)),空间复杂度是O(m+n), 稳定主要看桶中选取的排序算法。上面的代码时间消耗为n+m+n+(n/m*logn/m)*m + n,去掉系数为O(n+m+n(logn-logm)),当n=m时,时间复杂度是O(n),当选取桶不当时,所有数据在一个桶中,则是桶所选取的算法的时间复杂度。空间复杂度是O(m+n):上面集合的内存是m+n。

花&败 3750

【愚公系列】十一大排序算法(九)-桶排序

排序算法是一种将一组数据按照特定的规则进行排列的方法。排序算法通常用于对数据的处理,使得数据能够更容易地被查找、比较和分析。下面是常见的11种排序算法:冒泡排序(Bubble Sort):比较相邻的元素,如果前面的元素大于后面的元素,就交换这两个元素的位置。时间复杂度为O(n^2)。选择排序(Selection Sort):在未排序的数据中找到最小(大)的元素,放置在已排序的数据末尾。时间复杂度为O(n^2)。

愚公智库 48万+

【桶排序】十大排序算法之桶排序

【桶排序】十大排序算法之桶排序,是属于【稳定】的排序算法。

✅ Java 开发工程师 1730

桶排序详解

掌握简单的排序算法。

2302_80297670的博客 5092

排列显示阿拉伯语、数字及英文时的处理方法

这段时间参与开发沙特阿拉伯的网站模板,模板使用的语言是阿拉伯语,其显示顺序为从右到左,而中文、数字及英文的显示顺序为从左到右 ,所以当遇到一行文字内既有阿拉伯语又有数字和英文时会出现语序混乱的问题,如 期待显示的文案为: 按顺序写入,对应的代码如以下,其中currency_pay为变量,值为356SAR <span>الدفع الفعلي:{{currency_pay}}</span> 显示为 الدفع الفعلي : 356SAR 金额356和货币符号SAR分开了,这样显

llq886的博客 5805

桶排序 (详细图解)

一、桶排序 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到O(n log n)下限的影响。 二、桶排序原理 核心思想:就是将大问题化小(分治思想) (...

qq_52253798的博客 3万+

PHP 对接建行生活订单推送接口

php对接建行订单推送

qq_43647026的博客 562

5G移动网络运维(优化)

5G 网络优化现状 移动通信行业属于技术密集型行业,是国民经济的重要支柱以及整个社会经济运转体系中不可或缺的基础。2019 年年底 5G 开始商用,截止到 2020 年3月,我国三大运营商建设了 16.1 万个 5G 基站,我国成为目前全球 5G 基站最多的国家。预计到 2020 年年底,我国运营商会建设大概 70 万个 5G 基站。基于 5G高频段的特性,信号覆盖距离会低于ins 基站,再加上 5G 万物互联的巨大经济潜力价值需求,后续三大运营商在 5G 基站建设数量上势必会超过当前 LTE 基站数量的

2301_78171382的博客 1325

算法:排序算法之桶排序

在前几回我们已经对冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、归并排序、堆排序、计数排序做了说明分析(具体详情可在公众号历史消息中查看)。本回,将对桶排序进行相关说明分析。 一、排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick ...

7-SEVENS 6万+

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 231

必学排序算法——桶排序

桶排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解桶算法。桶排序(Bucket Sort)是一种基于分配策略的排序算法,其工作原理是将数组分到有限数量的桶子里,然后对每个桶内的元素进行排序(可能再使用其他排序算法或是以递归方式继续使用桶排序),最后合并所有已排序的桶,从而完成整个数据集的排序。

ycs66的博客 9062

软件工程导论实践:从需求到架构的机票预订系统全流程解析

本文深入解析机票预订系统从需求分析到架构设计的全流程实践,涵盖业务流程、功能建模、模块化设计、性能优化等关键环节。通过实际项目经验,分享软件工程导论在复杂系统开发中的应用技巧,包括数据流图绘制、E-R图设计、微服务架构及高并发处理等实战策略,助力开发者构建高效可靠的机票预订系统。

weixin_29202213的博客 414

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查)

本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。

aa123的博客 716

【十大排序算法】(九)桶排序算法

一、基本思想 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket Sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 二、算法分析 1、算法描述 设置一个定量的数组当作空桶; 遍历输入数据,并且把数据一个一个放到对应的桶里去; 对...

riemann_的博客 1646

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

数据集样本太少怎么办?数据集优质图像不够怎么办?如何做到更好的数据预处理?一文带你学会数据增强,还可实现带标签的扩充。

路人贾的博客 4万+

【十大排序算法】桶排序

在时间的琴弦上,桶排序如同一曲清澈的溪流,将数字的芬芳温柔地分拣,沉静地落入各自的花瓣般的容器中。

DC1020的博客 2178

YOLO26改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的YOLO26目标检测轻量化改进方法研究。主要用于轻量化应用部署,相关轻量化改进与其整体架构非常适配。通过整合、以及优化的,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中、、、和五种模型,以满足不同的需求。MobileNetV4: Universal Models for the Mobile Ecosystem是一系列适用于移动生态系统的通用高效模型。以下将详细介绍其轻量化设计的出发点、原理、结构和优势:的实现代码如下: 四、修改步骤 4.1 修

Limiiiing的博客 827

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

排序算法(九):桶排序

桶排序作为一种非比较型排序算法,在处理特定类型的数据时具有非常高效的性能,尤其在数据均匀分布时,能够利用桶的划分将数据的排序过程变得更加高效。然而,桶排序也有一定的局限性,尤其在数据分布不均匀时,可能会导致性能下降。在实际开发中,选择合适的排序算法非常关键。对于数据范围已知且分布均匀的情况,桶排序是一种非常有用的工具。而在其他更加复杂的数据场景下,我们可以考虑使用其他更为通用的排序算法,如快速排序、归并排序等。

一碗黄焖鸡三碗米饭的博客 945

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

排序算法——桶排序

桶排序 桶排序又称箱排序,其主要思想近乎分治法的思想。其原理是:讲待排序列(集合)中的元素分到数量有限的桶中,每个桶在进行排序。 桶排序不属于比较排序的一种,因此不受排序算法时间复杂度下限nlogn的限制。桶排序算法的时间复杂度为O(n)。是所有排序算法中最快的,但桶排序的空间复杂度也对应较高,是以空间换时间的排序算法。 同时,需要注意的是,桶排序对数据进行了一定的要求和限制,并不是所有情况下都能...

Mr.DImple的博客 1983

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++】十大排序算法之 桶排序 & 基数排序

排序算法是《数据结构与算法》中最基本的算法之一。

K1_uestc的博客 2924

经典排序算法之桶排序详解|c++代码实现|简单易懂

经典排序算法之桶排序详解|c++代码实现|简单易懂

qq_64431512的博客 1890
上一篇: 基本排序算法 之八 ——计数排序
下一篇: 基本排序算法 之十 ——基数排序
晨晚_
博客等级 码龄9年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值