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

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

用Python实现四叉树(quad tree)

import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s

weixin_44164489的博客 5868

桶排序 (详细图解)

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

qq_52253798的博客 3万+

多节阶梯阻抗变换器工程设计的公式推导

  多节阶梯阻抗变换器工程设计的公式推导,仔细看此文,有点烧脑,所以碎片十分钟,收获一丢丢。   现在就来设计一个超宽带多节阶梯阻抗变换器,要求带内纹波符合切比雪夫分布。   其实,此文已经是省去了大量中间公式推导,只剩下精炼内容了。   阶梯阻抗变换器指标需求   假设现在有一项目需求分析结果是:做一个微带线超宽带阶梯阻抗变换器,指标如下:   从50欧变换到100欧;   回波损耗22dB;   功率容量:2W;   频率范围2~18GHz;   插损能做多少就多少,用30mil板厚.

wusuowei1010的博客 7806

Vectorless dynamic动态功耗分析——Voltus

power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF)

qq_44347276的博客 2790

算法:排序算法之桶排序

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

7-SEVENS 6万+

VSCode+Typst零配置写作指南:5分钟搞定论文排版环境(含实时预览技巧)

本文介绍如何利用VSCode和Typst快速搭建零配置的论文排版环境,5分钟内实现高效写作与实时预览。Typst作为轻量级排版工具,结合LaTeX的精度与现代化语法,显著提升学术写作效率,特别适合需要频繁调整格式的研究人员。

weixin_30642561的博客 110

必学排序算法——桶排序

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

ycs66的博客 9062

网络摄像机Sensor低光性能实测:海思平台搭配索尼IMX335 vs 豪威OV4689

本文通过海思Hi3516DV300平台,对索尼IMX335与豪威OV4689两款网络摄像机Sensor进行低光性能实测。在信噪比、动态范围及实景成像对比中,IMX335凭借更优的噪声控制与稳定性表现领先,尤其在极低光环境下优势明显。文章为安防监控项目的Sensor选型与海思平台优化提供了数据参考与实战建议。

silver的专栏 830

OpenClaw 在 Windows 环境下的完整安装、配置和部署指南

介绍Windows环境下OpenClaw的完整安装,配置和部署的全流程

hxbao的专栏 1486

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

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

riemann_的博客 1646

【机器学习|评价指标8】混淆矩阵(Confusion Matrix)、Cohen‘s Kappa 系数、详解,平均交并比(mIoU)、列联表(Contingency Table)附代码。

【机器学习|评价指标8】混淆矩阵(Confusion Matrix)、Cohen's Kappa 系数、详解,平均交并比(mIoU)、列联表(Contingency Table)附代码。

2401_89898861的博客 1430

【十大排序算法】桶排序

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

DC1020的博客 2178

29、机器人动力学中的欧拉 - 拉格朗日与哈密顿力学

本文深入探讨了机器人动力学中的欧拉-拉格朗日与哈密顿力学框架,涵盖向量流形上的辛结构、哈密顿方程的几何代数表述、泊松括号与积分不变量等核心概念。文章详细推导了机电系统中拉格朗日量与哈密顿量的构建方法,并结合牛顿-欧拉算法给出了局部哈密顿量和动量导数的迭代计算流程,适用于多关节机器人的动力学建模与控制设计。通过应用案例展示了理论在双关节机器人手臂中的实际运用,最后展望了其在优化控制、鲁棒性提升及智能融合方向的潜力。

perl8的博客 129

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

排序算法(九):桶排序

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

排序算法——桶排序

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

Mr.DImple的博客 1983

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

余额充值