排序算法-计数排序、桶排序、基数排序

news2024/9/23 15:27:22

计数排序、桶排序、基数排序

这三种排序算法都利用了桶的概念,都属于用空间换时间的算法。但对桶的使用方法上有明显差异:

  • 计数排序:每个桶只存储单一键值;
  • 桶排序:每个桶存储一定范围的数值;
  • 基数排序:根据键值的每位数字来分配桶;

计数排序

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。

通俗地理解,例如有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去 1 的原因。

图示:
在这里插入图片描述

算法的步骤如下:

(1)找出待排序的数组中最大和最小的元素
(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项
(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

function countingSort(arr, maxValue) {
    var bucket = new Array(maxValue+1),
        sortedIndex = 0;
        arrLen = arr.length,
        bucketLen = maxValue + 1;

    for (var i = 0; i < arrLen; i++) {
        if (!bucket[arr[i]]) {
            bucket[arr[i]] = 0;
        }
        bucket[arr[i]]++;
    }

    for (var j = 0; j < bucketLen; j++) {
        while(bucket[j] > 0) {
            arr[sortedIndex++] = j;
            bucket[j]--;
        }
    }

    return arr;
}

桶排序

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

在额外空间充足的情况下,尽量增大桶的数量
使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

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

基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
图示:
在这里插入图片描述

var counter = [];
function radixSort(arr, maxDigit) {
    var mod = 10;
    var dev = 1;
    for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
        for(var j = 0; j < arr.length; j++) {
            var bucket = parseInt((arr[j] % mod) / dev);
            if(counter[bucket]==null) {
                counter[bucket] = [];
            }
            counter[bucket].push(arr[j]);
        }
        var pos = 0;
        for(var j = 0; j < counter.length; j++) {
            var value = null;
            if(counter[j]!=null) {
                while ((value = counter[j].shift()) != null) {
                      arr[pos++] = value;
                }
          }
        }
    }
    return arr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络基础(基础概念)

Linux网络基础(基础概念) 文章目录Linux网络基础(基础概念)1.计算机网络的发展过程1.1 独立模式1.2 网络互联模式1.3 局域网 LAN1.4 广域网 WAN2.计算机网络协议2.1 协议的概念2.2 什么是网络协议2.3 什么是网络协议簇2.4 OSI 七层模型2.5 TCP/IP 五层模型3.网络传输基本流程3.…

3M EDI 855 采购订单确认报文详解

3M公司&#xff0c;全称明尼苏达矿业及机器制造公司。它于1902年成立&#xff0c;总部现位于美国明尼苏达州首府圣保罗市&#xff0c;为世界著名的多元化跨国企业&#xff0c;并且是道琼斯30种工业成分指数股票之一。 3M为管理其庞大的供应链建立了EDI&#xff08;Electronic D…

微信小程序|使用小程序制作一个马赛克处理工具

此文主要使用微信小程序制作一个马赛克处理工具&#xff0c;这个场景在生活中也非常常见&#xff0c;例如新闻之类有些视频或者图片不想给大众展示就会将其和谐掉&#xff0c;这就是马赛克应用。 开发步骤创建小程序功能开发实现API接口响应开发步骤 创建小程序 准备百度以及微…

[附源码]Python计算机毕业设计Django医疗器械公司公告管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2022年11月份中国最具影响力的50位钧瓷匠人排行榜

讲好钧瓷产业的故事 有深度的故事&#xff0c;有温度的内容 有态度的文字&#xff0c;有立场的思考 版权声明:钧瓷内参独家发布&#xff0c;侵权必究 第320期 钧瓷内参 2022年12月1日 低代码——钧瓷企业数字化转型的核心引擎 2022年11月…

百趣代谢组学分享,肠道神奇细菌竟能调控体重,减肥有望“吃出来”

​代谢组学分享&#xff0c;上海交通大学附属瑞金医院宁光院士团队在Nature Medicine在线发布中国人肥胖的肠道菌群的较新研究&#xff0c;发现一系列丰度显著异于正常体重人群的肠道共生菌&#xff0c;其中多形拟杆菌&#xff08;BT菌&#xff09;口服可降低小鼠血清谷氨酸浓度…

java计算机毕业设计ssm校园安全随手拍系统wc38l(附源码、数据库)

java计算机毕业设计ssm校园安全随手拍系统wc38l&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

港科夜闻|香港科大张利民教授荣获2023年度美国土木工程师学会派克奖(Ralph B. Peck Award)...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大张利民教授荣获2023年度美国土木工程师学会派克奖(Ralph B. Peck Award)。张利民教授因在岩土多灾害风险评估、基于风险的工程设计和应急决策等领域的杰出贡献&#xff0c;荣获 2023年度美国土木工程师学会派克奖&a…

如何在 Spring Boot 项目中使用 Thymeleaf 和 Bootstrap 实现文件上传

在本教程中&#xff0c;我将向您展示如何在 Spring Boot 项目中使用 Thymeleaf 和 Bootstrap 实现文件上传。我们还使用 Spring Web MultipartFile界面来处理 HTTP 多部分请求。 Thymeleaf 文件上传概述 我们的 Spring Boot Thymeleaf 文件上传示例将具有以下功能&#xff1…

MongoDB的简介及安装配置

文章目录1、什么是MongoDB2、下载3、安装4、配置5、启动拓展&#xff08;mongo不是内部或外部命令&#xff09;1、什么是MongoDB MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据…

Matlab基于KD树的离散点密度特征提取—点云处理及可视化第4期

在之前的文章中&#xff0c;分享了Matlab基于KD树的邻域点搜索方法&#xff1a; 在此基础上&#xff0c;进一步分享一下基于KD树的离散点密度特征提取方法。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;《Matlab点云处理及可视化》系列文章整理自作者博士期间的部分…

汇编语言与微机原理 期末半开卷复习整理(下)

输入输出 8086采用I/O端口独立编址 in AL/AX,imm8/DX out imm8/DX,AL/AX 大于0FFH的端口只能存在DX 读外设(查询) status:in al,dxtest al,80H;//测标志位jz statusmov dx,100hin al,dx写外设&#xff08;查询&#xff09; status:mov dx,102Hin al,dxtest al,80Hjnz status…

Qt实现跨平台窗口选择功能

Qt实现跨平台获取鼠标位置窗口大小功能 文章目录Qt实现跨平台获取鼠标位置窗口大小功能1、概述2、实现效果3、实现原理4、关键代码5、源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt自定义模块、工具&#x1f448; 1、概述 Qt版本&#xff1a…

从源码层面理解 React 是如何做 diff 的

大家好&#xff0c;我是前端西瓜哥。今天带带大家来分析 React 源码&#xff0c;理解它的单节点 diff 和多节点 diff 的具体实现。 React 的版本为 18.2.0 reconcileChildFibers React 的节点对比逻辑是在 reconcileChildFibers 方法中实现的。 reconcileChildFibers 是 Chil…

ATTCK-T1003-001-操作系统凭据转储:LSASS内存

0x01基础信息 具体信息详情ATT&CK编号T1003-001所属战术阶段凭据访问操作系统windows 7 旗舰版 SP1创建时间2022年11月17日监测平台火绒安全、火绒剑、sysmon 0x02技术原理 攻击者可能会尝试访问存储在本地安全机构子系统服务 (LSASS) 进程内存中的凭证材料。用户登录后&…

Linux文件服务配置FTP服务

作者简介&#xff1a;一名99年软件运维应届毕业生&#xff0c;正在自学云计算课程。宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。创作不易&#xff0c;动动小手…

【Python恶搞】Python实现祝福单身狗的恶搞项目,快@你的好朋友,祝福他吧 | 附源码

前言 halo&#xff0c;包子们上午好 咱就说&#xff0c;谁还没有一个单身的小伙伴呢 今天这个代码主要是为了祝福咱们单身的小伙伴 咱就说废话不多说&#xff0c;直接上才艺 相关文件 关注小编&#xff0c;私信小编领取哟&#xff01; 当然别忘了一件三连哟~~ 源码点击蓝色…

数据可视化是让信息表现更复杂?很多人可能错了

数据可视化&#xff0c;目前行业中很多人认识有些偏颇&#xff0c;数据可视化就是单纯认为是大屏展示、酷炫的图表&#xff0c;很多人仅仅是把数据可视化 作为展厅中的刚性需求而已&#xff0c;其实这个是对数据行业的偏见&#xff0c;很多人侧重于数据的表现&#xff0c;而非便…

谷歌北大扩散模型(Diffusion Model)首篇综述来了!

本综述&#xff08;Diffusion Models: A Comprehensive Survey of Methods and Applications&#xff09;来自加州大学&Google Research的Ming-Hsuan Yang、北京大学崔斌实验室以及CMU、UCLA、蒙特利尔Mila研究院等众研究团队&#xff0c;首次对现有的扩散生成模型&#xf…

ftp工具的21端口无法连上远程主机

一、检测是否有安装vsffpd netstat -tunlp 没有安装先安装 1.安装 vsftpd 执行以下命令&#xff0c;安装 vsftpd。 yum install vsftpd -y 2.启动服务 执行以下命令&#xff0c;启动服务。 systemctl start vsftpd 3.执行以下命令&#xff0c;确认服务是否启动。 netstat -tun…