十大经典排序算法(动态演示+代码)-桶排序

2023-10-27

桶排序

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

将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。

1)例如:数组:

(2)观察知:数组的元素分布在(0~50)之间,我们可以将其分隔成五个区间分辨是[0~9],[19~19],[20~29],[30~39],[40~49];(桶的个数根据题意自定,只需确定好每个桶的存储范围就好;并非桶越多越好,也并非越少越好总之适当就好);

(3)这五个区间看做五个桶;分别存放符合范围的数字;

(4)将这五个区间分别排序,再输出;

算法思想

  1. 设置一个定量的数组当作空桶子。

  2. 寻访序列,并且把项目一个一个放到对应的桶子去。

  3. 对每个不是空的桶子进行排序。

  4. 从不是空的桶子里把项目再放回原来的序列中。

f9c64c9a4005888a34d6924613556902.gif

桶排序动图演示

代码:

function bucketSort(arr, bucketSize) {
    if (arr.length === 0) {
      return arr;
    }
 
    var i;
    var minValue = arr[0];
    var maxValue = arr[0];
    for (i = 1; i < arr.length; i++) {
      if (arr[i] < minValue) {
          minValue = arr[i];                // 输入数据的最小值
      } else if (arr[i] > maxValue) {
          maxValue = arr[i];                // 输入数据的最大值
      }
    }
 
    // 桶的初始化
    var DEFAULT_BUCKET_SIZE = 5;            // 设置桶的默认数量为5
    bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
    var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
    var buckets = new Array(bucketCount);
    for (i = 0; i < buckets.length; i++) {
        buckets[i] = [];
    }
 
    // 利用映射函数将数据分配到各个桶中
    for (i = 0; i < arr.length; i++) {
        buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
    }
 
    arr.length = 0;
    for (i = 0; i < buckets.length; i++) {
        insertionSort(buckets[i]);                      // 对每个桶进行排序,这里使用了插入排序
        for (var j = 0; j < buckets[i].length; j++) {
            arr.push(buckets[i][j]);
        }
    }
 
    return arr;
}

桶排序算法特点

1.时间复杂度
桶排序算法遍历了2次原始数组,运算量为2N,最后,遍历桶输出排序结果的运算量为N,初始化桶的运算量为M。

对桶进行排序,不同的排序算法算法复杂度不同,冒泡排序算法复杂度为O(N^2),堆排序、归并排序算法复杂度为O(NlogN),我们以排序算法复杂度为O(NlogN)进行计算,运算量为N/M*log(N/M)*M

最终的运算量为3N+M+N/M*log(N/M)*M,即3N+M+N(logN-logM),去掉系数,时间复杂度为O(N+M+N(logN-logM))

2.空间复杂度
桶排序算法排序过程中新建了一个桶和一个输出数组,所以算法的空间复杂度是O(N+M)

3.稳定性
桶排序算法在对每个桶进行排序时,选择稳定的排序算法,则排序后,相同元素的位置不会发生改变,所以桶排序算法是一种稳定的排序算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十大经典排序算法(动态演示+代码)-桶排序 的相关文章

随机推荐

  • python---之plt.subplot画图详解

    转载 https www cnblogs com nju2014 p 5620776 html Matplotlib 详解图像各个部分 首先一幅Matplotlib的图像组成部分介绍 在matplotlib中 整个图像为一个Figure对象
  • 关于word中插入知网e-study插件问题

    写论文过程中难免会出现word中e study莫名其妙的被禁止 估计是被杀毒软件或启动项什么的优化禁止了 打开word gt word选项 gt 加载项 gt 管理 gt 禁用项目 gt 把e study相关插件删除 在COM 加载项中将
  • Python温习(四)——编程常识与正则

    基础功能 Python中 前面已经创建了变量类型并赋值存在的对象 下次再进行使用的时候 不需要重新再次进行输入 只需要进行输入前两个字母 以Tab键进行历史对象查找后 进行切换回车 1 input和print输入 输出 da input 请
  • 2019-2020-1 1823《程序设计与数据结构》第二、三周作业总结

    作业地址 第二 三周作业总结 https edu cnblogs com campus besti 2019 2020 1 1823 PDDS homework 7585 提交情况如图 忘记提交作业 已在博客分中扣除相应的分数 作业问题 优
  • 2023华为OD机试真题-分界线(JAVA、Python、C++)

    题目描述 电视剧 分界线 里面有一个片段 男主为了向警察透露案件细节 且不暴露自己 于是将报刊上的字剪切下来 剪拼成匿名信 现在有一名举报人 希望借鉴这种手段 使用英文报刊完成举报操作 但为了增加文章的混淆度 只需满足每个单词中字母数量一致
  • sqlmap详细使用教程

    文章目录 简介 SQL注入 流程 命令参数 拓展 SQLmap用户手册 简介 Sqlmap是一个自动化检测和利用SQL注入漏洞的免费开源工具 对SQL注入漏洞进行检测的最佳工具 支持对多种数据库进行注入测试 能够自动识别数据库类型并注入 支
  • 买卖股票类问题动态规划解法(Leetcode题解-Python语言)

    在 Leetcode 中 关于买卖股票的问题共有6道 而这些题目是可以用相同的思维进行求解的 强烈推荐这篇总结 写得非常到位 股票类问题的动态规划分三步走 1 首先明确方程的含义 T i k 0 表示在第 i 天结束时 最多进行 k 次交易
  • 架构演变

    一 传统架构方式 最初做项目时 架构一般都会分为3层 即表现层展示系统界面 业务层处理各种业务逻辑 持久层操作来源于数据库中的数据 数据库中则存储我们需要存储的数据 这种三层架构的方式适用于大多数项目 但这种方法还不能称之为架构 我们做的时
  • PyTorch中张量的shape和stride的关系

    个人总结 以下是juppyter notebook下的实验
  • Web安全常见漏洞原理、危害及其修复建议

    web安全常见漏洞原理 危害及其修复建议 一 SQL注入漏洞 原理 危害 修复建议 二 XSS漏洞 原理 危害 修复建议 三 CSRF漏洞 原理 危害 修复建议 四 SSRF漏洞 原理 危害 预防建议 五 文件上传漏洞 原理 危害 修复建议
  • 弗洛伊德算法(floyd)

    算法背景 图中的A B C D E F G 代表7个村庄 边上的权值带表两村庄之间的距离 现在要从某一个村庄 例如G村庄 往另外几个村庄送邮件 问任意一村庄到其他各村庄的最短距离分别是多少 思路 该问题实际是求从任一顶点到其余顶点的最短距离
  • 揭秘京东城市时空数据引擎—JUST如何助力交通流量预测

    2014年跨年夜上海外滩人流隐患事件 使得公共安全问题受到了全体社会的广泛关注 解决这一问题的很重要一项工作就是 如何实时监控和快速预测城市中每个地方的人流量 当某个地方的人流量超过给定的值或者有超过给定值的趋势时 相关部门能及时地采取相关
  • Python学习笔记(六):数据可视化

    1 使用matplotlib绘制图形 1 1 绘制折线图 import matplotlib pyplot as plt b 1 2 3 4 5 6 7 a 1 4 9 16 25 36 49 plt plot b a linewidth
  • js在控制台输出菱形

    js在控制台输出菱形 以一个上半部分10行 下半部分9行的为例 var str 在控制台输出要采用字符串拼接 所以先定义一个空字符串 for var row 1 row lt 10 row 外层循环控制行数 先输出上半部分的10行 for
  • HTTPOXY -- CGI 环境变量劫持漏洞分析

    0x00 前言 昨晚 一个名为 HTTPOXY 的漏洞在安全圈内广泛传播 云盾攻防对抗团队第一时间对此漏洞进行了深入分析 发现其本质是一个 CGI 环境变量劫持漏洞 对 CGI 的环境变量 HTTP PROXY 变量进行劫持 如果 CGI
  • Python作业

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 python安装步骤 打开官网 https www python org downloads windows 下载中心 测试安装是否成功 windows gt 运行
  • BurpSuite学习:在火狐浏览器使用foxyproxy添加代理127.0.0.1后无法正常上网

    个人认为 因为127 0 0 1就是本机上的本地服务器 它应该不具备服务器的功能 所以浏览器向本地服务器发送请求也不会转发到外网 更不会得到回应 打开burpsuite 它会承担服务器的作用转发请求 这时候浏览器会显示应该是请求被拦截之类的
  • 基于zinx的go tcp通信案例

    基于zinx的go tcp通信示例 一 zinx简介 https gitee com Aceld zinx Zinx是一个基于Golang的轻量级tcp服务框架 根据官方的定位 zinx是在游戏领域或者其他长链接的领域的轻量级企业框架 其使
  • Android RecyclerView对应的适配器中方法的执行顺序和具体作用详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 1 代码的执行顺序为 首次进入会先调用getItemCount 返回条目的个数 之后会分别调用 getIt
  • 十大经典排序算法(动态演示+代码)-桶排序

    桶排序 桶排序 Bucket sort 或所谓的箱排序 是一个排序算法 工作的原理是将数组分到有限数量的桶里 每个桶再个别排序 有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序 最后依次把各个桶中的记录列出来记得到有序序列 桶排