计数排序(线性时间排序)

背景

1954年由 Harold H. Seward 提出

基本思想:

假设:计数排序假设n个输入元素中的每一个都是介于0到k之间的整数

举例:10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序

年龄有重复时需要特殊处理(保证稳定性) 算法最后一步

优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法

当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序

算法基本步骤:

(1)找出待排序的数组中最大和最小的元素

(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项

(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

计数排序伪代码

正常的思路

COUNT—SORT(A,B,k) 
let C[0..k]be a new array
for i=0 to k C[i]=0
for j=1 to A.length C[A[j]]=C[A[j]]+1 
//C[i]now contains the number of elements equal to i
for i=1 to k C[i]=C[i]+C[i-1] 
//C[i] now contains the number of elements less than or equal to i 
//在这里最终得出的C有这样的规律,A[j]最终应该放在
//下标为C[A[j]-1]+1~C[A[j]]的位置
for j=A.length downto 1
//为了保持稳定性,这里从后面开始遍历了
//如果换成for 1 downto j=A.length,那么元素相等的地方刚好反过来B[C[A[j]]]=A[j]C[A[j]]=C[A[j]]-1

需要注意的是k为A中的最大值-(A中的最小值-1)

另一种思路

如果第13行,我非得从1开始呢,但又想保持稳定性呢,该如何办

我们记得:

在这里最终得出的C有这样的规律,A[j]最终应该放在下标为C[A[j]-1]+1~C[A[j]]的位置

COUNT—SORT(A,B,k) 
let C[0..k]be a new array
for i=0 to k C[i]=0
for j=1 to A.length C[A[j]]=C[A[j]]+1 
for i=1 to k C[i]=C[i]+C[i-1] 
//这里需要单独处理一下,需要C[-1]=0
//当然下标不可能为负数,我们可以让下标整体都+1就可以解决问题
//这里为了方便与上面思路对照,直接认为C[-1]=0是允许的
C[-1]=0
for j=1 downto A.lengthB[C[A[j]-1]+1]=A[j]C[A[j]-1]=C[A[j]-1]+1
//这个思路也是稳定的

计数排序举例(正常思路)

循环1

循环2

循环3

循环4

运行时间

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

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

相关文章

本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程连接

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等…

通讯录管理系统

文章目录 1.系统需求2.创建项目3.菜单功能4.退出功能实现5.添加联系人5.1设计联系人结构体5.2设计通讯录结构体5.3main函数中创建通讯录 6.显示联系人6.1封装显示联系人函数6.2测试显示联系人功能 7.删除联系人7.1封装检测联系人是否存在7.2封装删除联系人函数7.3测试删除联系人…

学习【Git项目管理工具】这一篇就够了

目录 1. Git概述2. Git代码托管服务3. Git常用命令3-1. Git全局配置设置用户信息查看配置信息 3-2. 获取Git仓库本地初始化仓库克隆远程仓库 3-3. 基本概念工作区文件状态 3-4. 本地仓库操作git reset 操作 3-5. 远程仓库操作查看远程仓库添加远程仓库推送远程仓库拉取远程仓库…

实战之-Redis商户查询缓存

一、什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震器",防止过高…

AWTK 开源智能串口屏方案视频介绍

强大的界面设计器 AWStudio。 基于 AWTK 实现强大的 GUI 功能(多窗口、输入法、动画和各种控件)。 基于 AWTK-MVVM 实现低代码开发(编写绑定规则即可实现常见应用程序)。 支持在 PC 上模拟运行,并提供 MCU 模拟器模…

SRC实战 | EDU通用漏洞分享

本文由掌控安全学院 - 叴龙 投稿 又是没事干的一天,写一下之前挖的两个通用漏洞。 1.信息搜集 首先就是信息搜集,挖edu没账号怎么办呢?sg不行,咱就找能自己注册的站。 Hunter:web.title”XX大学”&&web.bod…

2024 Google material-design-icons助力你创建更好的Material风格应用

2024 Google material-design-icons助力你创建更好的Material风格应用 Material Icons / Material Symbols 这是谷歌推出的两个不同的官方图标集,它们使用相同的基础设计。Material Icons是经典的图标集,而Material Symbols是在2022年4月引入的&#x…

Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile 我们首先需要知道的是,make是一个命令,Makefile是一个文件,Makefile中包含了依赖关系和依赖方法。 从上面的文件以及指令中我们可以看到,我们可以在Makefile文件中写入依赖关系以及对应的依赖方法&…

设计模式⑦ :简单化

文章目录 一、前言二、Facade 模式1. 介绍2. 应用3. 总结 三、Mediator 模式1. 介绍2. 应用3. 总结 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容…

配置redis挂载

1. 暂停和删除redis 2.创建文件夹 /usr/local/software/redis/6379/conf/ /usr/local/software/redis/6379/data/ 把redis-conf文件上传到conf文件夹中 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4.运…

Go后端开发 -- 反射reflect 结构体标签

Go后端开发 – 反射reflect && 结构体标签 文章目录 Go后端开发 -- 反射reflect && 结构体标签一、反射reflect1.编程语言中反射的概念2.interface 和反射3.变量内置的pair结构4.reflect的基本功能TypeOf和ValueOf5.从relfect.Value中获取接口interface的信息6…

C++ 设计模式之 中介者模式

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是中介者模式 (第16种模式) 中介者模式(Medi…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

TQ8WS-acid,Tide Quencher 8WS-酸,可用来研究荧光物质的激发态

您好,欢迎来到新研之家 文章关键词:Tide Quencher8WS acid,TQ8WS acid,Tide Quencher 8WS 酸 ,TQ8WS 酸,Tide Quencher 8WS-酸,TQ8WS-酸 一、基本信息 产品简介:The fluorescence…

牛客.KY11二叉树遍历、 LeetCode104.二叉树的最大深度 ,110平衡二叉树

二叉树实操小练习~这里对二叉树的遍历要有一定的理解,如果还不熟悉的小伙伴可以看看我的这篇博客:数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q-CSDN博客 牛客.KY11二…

文档翻译网站有哪些?这些工具高效翻译

文档翻译网站有哪些?随着全球化的加速,跨语言沟通变得越来越重要。然而,语言差异常常成为我们与世界各地人们交流的障碍。为了解决这个问题,文档翻译软件应运而生。今天,我们就来介绍一些受欢迎的文档翻译软件&#xf…

【Docker】安装nacos以及实现负载均衡

🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 前言 一.nacos单个部署 1.镜像拉取 …

4.C++类和对象

深拷贝和浅拷贝的简单理解:

提纲框架写作方法

论文提纲 论文提纲的意义 有利于检查构思有利于调整修改和写作 拟定提纲的目的 拟标题写总论点做总安排:几个方面,什么顺序做下位论点:每个项目的下位论点,直到段一级,写段的论点句考虑各段安排,把材料…