数据结构与算法之计数排序

目录

前言

计数排序

定义

优缺点

策略

图解

代码实现

结束语


前言

今天是坚持写博客的第20天,时光飞逝,第二个10天即将过去,希望可以继续坚持,光明的未来也在未来等着我们。今天也恰逢高考,祝所有学子一帆风顺,考的全会,蒙的全对!

我们今天来看计数排序,这是数据结构与算法中一种常见的算法,且听我娓娓道来。


计数排序

定义

计数排序的基本思想是对于待排序的数组,首先确定数组中元素的取值范围,然后使用一个计数数组来统计每个元素的出现次数。最后根据计数数组来确定每个元素在排序后数组中的位置。

优缺点

  • 优点:计数排序是一种稳定的排序算法,当输入的元素是整数,且元素的取值范围较小或已知时,计数排序的效率很高
  • 缺点:当待排序的数组中的元素取值范围很大时,计数数组会占用大量的内存空间,容易造成空间的浪费和查找时的效率上复杂化。计数排序也不是原地排序算法,需要额外的内存空间来存储计数数组和排序后的数组。

策略

假设我们有一个打乱顺序的数组:(5,7,2,5,1,6,5,8,6,2),此时我们需要使用计数排序进行排序,我们需要遵循以下步骤:

  1. 首先创建一个最大容量为数组中最大值+1的数组用于计数。比如这个数组当中最大值为8,因此我们创建一个大小为9的数组。(因为需要排0)
  2. 遍历创建好的数组,都赋初值为0。
  3. 根据元素的值对号入座,比如数字5出现1次,5号位置就增加1,7出现1次,7号位置就增加1。
  4. 重复第三步,完成统计。
  5. 输出结果,元素的值为多少,就输出对应下标几次。例如0出现0次,这0不输出,7出现1次,就输出7一次。(需要按照下标从小到大来)

但是需要注意的是,如果是从95开始,有一个未排列的数组(95,97,92,95,91,96,95,98,96,92),此时我们需要有一个初始值,对于这个数组我们可以用90当初始值,用数组内的元素值减掉基准值90,再放入对应位置进行计数。比如95-90=5,那么数字“5”出现1次,5号位置增加1。

同时还是(95,97,92,95,91,96,95,98,96,92)这个栗子,我们用最大值加一的形式创建数组用于计数,那么会造成90以前的空前全部浪费。因此我们需要用最大值-最小值+1作为数组的大小,并以最小值作为基准值。

图解

光看策略可能不一定清晰,我们直接上图:

我们将数字填入对应下标处,并累加。累加完成后进行排序输出:1,2,2,5,5,5,6,6,7,8。

代码实现

下面是大家期待的代码实现,下面是python版本的计数排序,供大家参考:

def counting_sort(arr):  # 找出数组中的最大值  max_val = max(arr)  # 初始化计数数组,大小为最大值加1,并全部初始化为0  count_arr = [0] * (max_val + 1)  # 统计每个元素的出现次数  for num in arr:  count_arr[num] += 1  # 修改计数数组,将每个元素的值变为小于等于该元素的元素个数  for i in range(1, len(count_arr)):  count_arr[i] += count_arr[i-1]  # 从后往前遍历原数组,根据计数数组中的值放置元素到排序后的数组  sorted_arr = [0] * len(arr)  for i in range(len(arr)-1, -1, -1):  sorted_index = count_arr[arr[i]] - 1  # 减1是因为我们需要的是索引,不是计数  sorted_arr[sorted_index] = arr[i]  count_arr[arr[i]] -= 1  # 放置元素后,对应计数值减1  return sorted_arr  # 示例用法  
arr = [4, 2, 2, 8, 3, 3, 1]  
print("原始数组:", arr)  
sorted_arr = counting_sort(arr)  
print("排序后的数组:", sorted_arr)

结束语

今天对计数排序的讲解就到这里,希望对大家有帮助,如果对您有帮助,希望您可以留下一个点赞或关注,这对我真的很重要,谢谢!

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

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

相关文章

Hive的常规操作

Hive常规操作 hive常用交互命令 -e执行sql语句 [rootmaster ~]# hive -e "show databases";-f执行sql脚本 [rootmaster ~]# hive -f /usr/local/demo.sql查看hive中输入的所有命令 [rootmaster ~]# cat ~/.hivehistory操作库 创建库 语法: create…

NC56 入库失败提示负库存解决方法

前言 公司的 NC ERP 接入了第三方系统进行出入库单据管理。用户反馈提交入库单据时、NC ERP 报错【负库存或辅数量方向不一致】。于是进行排查和解决。 操作环境 NC ERP V56 。操作系统 Windows 11 ,数据库 Oracle DB 。 操作步骤 1、查询 NC “收发存汇总表”…

AWS-生产级微服务部署架构分享

使用AWS搭建云上应用 名词解释 AWS ECR:AWS ECR 容器存储库,按项目名创建容器仓库,一个项目对应一个仓库,目前是由Jenkins构建镜像远程push到AWS ECR。 **AWS ECS:Amazon Elastic Container Service (ECS) &#xf…

Android Uri转File path路径,Kotlin

Android Uri转File path路径,Kotlin /*** URI转化为file path路径*/private fun getFilePathFromURI(context: Context, contentURI: Uri): String? {val result: String?var cursor: Cursor? nulltry {cursor context.contentResolver.query(contentURI, null…

设备上CCD功能增加(从接线到程序)

今天终于完成了一个上面交给我的一个小项目,给设备增加一个CCD拍照功能,首先先说明一下本次使用基恩士的CCD相机,控制器,还有软件(三菱程序与基恩士程序)。如果对你有帮助,欢迎评论收藏&#xf…

绘唐官网绘唐科技

绘唐AI工具是一种基于人工智能技术的绘画辅助工具。 使用教程:https://iimenvrieak.feishu.cn/docx/CWwldSUU2okj0wxmnA0cHOdjnF 它可以根据用户提供的输入或指令生成各种类型的图像。 绘唐AI工具可以理解用户的绘画需求,并根据用户的要求生成具有艺术…

HarmonyOS开发-鸿蒙UiAbility 组件间跳转

前言 随着春节假期结束各行各业复产复工,一年一度的春招也持续火热起来。最近,有招聘平台发布了《2024年春招市场行情周报(第一期)》。总体来说今年的就业市场还是人才饱和的状态,竞争会比较激烈。 但是,…

操作系统教材第6版——个人笔记5

3.2 单连续分区存储管理 3.2.1 单连续分区存储管理 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续分区存储管理固定分区存储管理可变分区存储管理 单用户连续分区存储管理 主存区域划分为系统区与用户区设置一个栅栏寄存器界分两个区域…

Linux网络服务之SSH(远程访问及控制)

ssh远程管理: ssh是一种安全通道协议,用来实现字符界面的远程登录。远程复制,远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式(可以实现免密登录) ssh 22 网络层 传输层 数据传输…

数据结构~~排序

目录 一、排序的概念 二、插入排序 直接插入排序 希尔排序 三、选择排序 选择排序 堆排序 四、交换排序 冒泡排序 快速排序 递归实现 非递归实现 五、归并排序 递归 非递归 六、非比较排序(计数排序) 七、其他排序 基数排序 桶排序 八…

计算机毕业设计python+hadoop+spark猫眼电影票房预测 电影推荐系统 猫眼电影爬虫 电影数据可视化 电影用户画像系统 协同过滤算法 数据仓库

山东青年政治学院毕业论文(设计)开题报告 学生姓名 高宜凡 学 号 202010520237 所在学院 信息工程学院 专 业 信息管理与信息系统(云计算与大数据技术) 指导教师姓名 李海斌 黄虹 指导教师职称 工程师 副教授 指导教…

通用树查找算法

想要一个树形控件来显示数据,却发现Racket的GUI库竟然没有提供这个控件。既然没有,那就自己手搓一个吧。没想到,在做这个控件中竟然有了新发现! 树形控件有一个功能是查找树中指定的节点。这就是接下来的故事的起点。 1 找外援 不…

【List,ArrayList与顺序表】

目录 1,什么是List 2,List的使用 3,线性表 4,顺序表 4.1 接口的实现 5, ArrayList简介 6,ArrayList的使用 6.1 ArrayList的构造方法 6.2 ArrayList的常见操作 6.3 ArrayList的遍历 7,…

【JMeter接口测试工具】第一节.JMeter简介和安装【入门篇】

文章目录 前言一、JMeter简介 1.1 JMeter基本介绍 1.2 JMeter优缺点二、JMeter安装 2.1 JMeter安装步骤 2.2 JMeter环境配置三、项目介绍 3.1 项目简介 3.2 API接口清单总结 前言 一、JMeter简介 1.1 JMeter基本介绍 JMeter 是 Apache 组织使用…

swiftUI使用VideoPlayer和AVPlayer播放视频

使用VideoPlayer包播放视频:https://github.com/wxxsw/VideoPlayer 提供一些可供测试的视频链接,不保证稳定可用哦: https://vfx.mtime.cn/Video/2019/06/15/mp4/190615103827358781.mp4https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

【全开源】CMS内容管理系统(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统,自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署,UniAPP版本提供全部无加密UniAPP源码​ 🔍 解锁内容管理新境界:C…

巧用Jmeter Debug sampler获取变量信息

Jmeter Debug sampler介绍 Jmeter Debug sampler 可以帮助我们解决如下问题: debug参数化的变量取值是否正确 debug正则表达式提取器(或json提取器)提取的值是否正确 查看 JMeter 属性 具体使用方法 前提条件:添加查看结果树…

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

运维监控领域你不得不知道的黑话-下篇

作者:Tshb 引言 书接上回:《运维监控领域你不得不知道的黑话-中篇》。 在上一讲中,我们对监控系统中的四种指标类型进行了详细的阐述。不同类型的指标可以提供不同维度的系统信息,通过对比不同类型的指标,可以让我们…