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

十大经典排序算法-桶排序算法详解 一、什么是桶排序 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

极智量化平台实战:5分钟教你用Python实现双均线交易策略(附完整代码)

本文详细介绍了如何在极智量化平台上使用Python实现双均线交易策略,包括数据获取、信号生成、回测分析和策略优化。通过完整的代码示例和实战演示,帮助开发者快速掌握量化交易系统的基本原理和应用方法,实现自动化交易。

weixin_29269441的博客 491

桶排序 (详细图解)

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

qq_52253798的博客 3万+

processing与arduino互动编程

Arduino开发板对AVR单片机二次编译封装,无需考虑单片机编程寄存器、地址指针等复杂细节processing借助arduino读取各种传感器的数值,控制各种机电装置。

weixin_45679408的博客 824

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言,什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块,STM32F030F4P6,这一个芯片没有USB,但是其他都有,引脚少,价格低廉,如果找不到原厂,可以买替代的国产芯片,性能也一样。 不管怎么样也是Cortex-M0,比8bit和16bit的性能都强,总的来说就是低价,引脚少,体积小的同时,还容易开发,有很多模拟输入可玩,还有SPI,硬件I2C等等 所以,这一款MCU真的是从理论来说又便宜又好用,非常适合把玩。 画个板,最小系统 STM32F030其..

arenascat的博客 2万+

算法:排序算法之桶排序

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

7-SEVENS 6万+

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 195

必学排序算法——桶排序

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

ycs66的博客 9062

国产化软件设计:遵循信创要求,助力信息技术自主创新

支持国产操作系统、CPU、数据库和中间件。确保网络通信的身份鉴别、数据传输机密性和完整性。实现应用和数据层的身份鉴别、数据传输机密性完整性、数据存储机密性完整性。依托法院密码服务平台提供的商用密码能力。

qq_41186565的博客 3372

MATLAB与图像处理(一):图像中结构张量的求法(Structure Tensor)

1.结构张量的作用:       能够区分图像中的平坦区域,边缘,角点; 2.图像中的结构张量的定义    1)是一个矩阵;    2)与图像的水平,垂直梯度有关,定义如下: 在MATLAB中,可以用如下语句求解:[Ix,Iy]=gradient(Image); 3)求出结构张量矩阵的行列式,和迹(矩阵对角线之和)   行列式:K=det(E);   迹:  

wenyusuran的专栏 5242

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

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

riemann_的博客 1646

AISBench benchmark评测工具实操-精度评测场景-采用命令行指定模型和数据集的方式

搭建AISBench benchmark测试环境,包括创建conda环境、安装AISBench benchmark、处理ceval数据集,并修改相关配置文件以适配测试需求。最终,通过启动精度测评,验证了模型在指定环境下的性能。

m0_50105717的博客 2042

【十大排序算法】桶排序

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

DC1020的博客 2178

华为OD机试真题 新系统【小花获胜的奶茶】

华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

qq_45776114的博客 385

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

排序算法(九):桶排序

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

排序算法——桶排序

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

Mr.DImple的博客 1983

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【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、付费专栏及课程。

余额充值