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

目录

前言

计数排序

定义

优缺点

策略

图解

代码实现

结束语


前言

今天是坚持写博客的第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.mzph.cn/pingmian/23808.shtml

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

相关文章

【DevOps】掌握 Helm:Kubernetes 应用程序部署指南

目录 一、前言 二、什么是 Helm? 三、Helm 的优势 四、Helm 组件 五、安装和配置 Helm 1、先决条件 2、安装 Helm 客户端 3、初始化 Helm 4、添加 Helm Charts 存储库 5、搜索和安装应用程序 5.1、搜索 Helm Charts 5.2、安装应用程序 5.3、自定义应用程…

echarts的toolbox自定义feature标签及事件

1. 需求 在使用echarts图时希望toolbox扩展一些自定义icon和点击事件,而不只是图中这些echarts提供的事件。 2. 文档 属性名类型描述toolbox.featureObject各工具配置项。 feature中除了echarts提供的各个内置的工具按钮外,可以自定义工具按钮。 除…

电脑ip地址查询:快速定位你的网络位置(4种方法)

在互联网的浩瀚海洋中,每台联网的电脑都有一个独特的身份标识,那就是IP地址。无论是进行网络通信、定位问题还是安全防护,了解自己或他人的电脑IP地址都是非常关键的。那么,电脑ip地址查询怎么操作呢?本文将为你提供一…

学习笔记——路由网络基础——缺省(默认)路由

3、缺省(默认)路由 1、定义 缺省路由(默认路由):是目的地址和掩码都为全0的特殊路由。全0代表任意网络。缺省路由在路由表中的形式为:0.0.0.0/0缺省路由也被叫默认路由。缺省路由优先级比直连路由低 缺省路由是一种特殊的路由,当报文没有在…

Facebook海外户Facebook广告被暂停的原因

有很多伙伴在Facebook广告时,有时会遇到账号被暂停,并通知你违反了哪些规则,那么Facebook广告被暂停的原因有哪些呢?今天小编详细梳理了一些原因,可以往下看哦~ 您的Facebook广告被暂停可能有以下几个原因&#xff1a…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略?Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略? 由于Redis内存是有大小的,当内存快满的时候,又没有…

【Qt】TreeWidget中Item的UserCheckable注意事项,没有出现多选框

1. 异常 开启 ItemIsUserCheckable以后,界面上没有出现多选框。 QTreeWidgetItem *item new QTreeWidgetItem();item->setText(0, "hello");item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable |Qt::ItemIsEnabled | Qt::ItemIsAuto…

AIGC 介绍与典型应用与亚马逊科技AIGC方案

1、AIGC ( 生成式人工智能 ) 是指可生成全新内容的人工智能技术 从字面意思来看,AIGC 是继 PGC,UGC 之后的新型内容创作方式,可以在创意、表现力、迭代、传播、个性化等方面,充分发挥技术优势,打造新的数字内容生成与…

AXI Quad SPI IP核AXI4接口下的三种操作模式

当选择Enable Performance Mode选项时,AXI4接口包括在内。在该模式下,IP核可以在增强模式下操作(未选择启用XIP模式)或XIP模式(选择启用XIP模式)。在性能模式下,AXI4接口用于在DTR和DRR位置的突…

力扣2106.摘水果

力扣2106.摘水果 在下标上做滑窗 二分出左边最远能取到的点j 自己写lowerbound (j,start)这个区间的水果数就是初值 如何判断一个区间是否合法 先往右走再往左走:fruit(right,0) - start fruit(right,0) - fruit(left,0);先往左走再往右走:start - fru…

ActiveMQ 介绍、下载、安装和控制台

ActiveMQ 介绍 Apache ActiveMQ 是一款非常成熟且功能全面的开源消息中间件,由Apache软件基金会维护。它遵循 Java Message Service (JMS) 规范,这意味着它提供了一组标准的 API,允许 Java 应用程序以一种标准化的方式发送和接收消息。 以下…

为何数据仓库需要“分层次”?

在数据驱动的商业世界中,数据仓库是企业决策的心脏。然而,一个高效、可扩展且易于管理的数据仓库,需要精心设计和构建。分层是构建数据仓库的关键策略之一。本文将探讨数据仓库分层的重要性以及它如何帮助企业更好地管理数据。 数据仓库分层…

操作系统期末填空、问答往年考试题总结

1、什么是文件目录?目录管理的要求有哪些? 文件目录是文件控制块FCB的有序集合,一个文件的文件名和对该文件实施控制管理的说明信息称为文件目录。 实现文件按名存取、提高对目录的检索速度、文件共享、允许文件重名。 2、什么是操作系统&…

游戏研发(策略+sass+回调模式)

前言 由于这边需要对接游戏研发后台,基本就是开服,封禁.角色日志等,但是每个游戏提供的接口都是不一样的,所以为了统一处理提前进行sass封装,以便后续可以更好的兼容 同时还涉及了多数据源的问题,因为有些日志太大不可能直接去http调用,会使用直接查询游戏研发的数据库方式这一…

前端修改接口返回测试工具 Inssman使用教程

之前用的requestly现在要登录才能用了,然后我又登录不上去,同事又推荐了个谷歌插件,试了下,挺好用,还不用登录,用法和之前差不多 下载网站:https://chromewebstore.google.com/detail/inssman-…

mysql json_quote和json_unquote的用法

在 MySQL 中,JSON_QUOTE() 和 JSON_UNQUOTE() 函数与 JSON 数据类型的处理有关。这两个函数在处理 JSON 字符串时特别有用。 JSON_QUOTE() JSON_QUOTE() 函数用于将字符串值转换为有效的 JSON 字符串。它会将特殊字符(如引号、反斜杠等)进行…

从入门到精通:Java Lambda运算符详解!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

力扣 503. 下一个更大元素 II

题目来源:https://leetcode.cn/problems/next-greater-element-ii/description/ C题解:因为是循环数组,所以对数组进行了两次遍历,相当于循环。使用了栈,一个存放元素,一个存放索引,用来更新res…

【C++ | 析构函数】类的析构函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-06 1…

使用MFC DLL

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除 应用程序与DLL链接后,DLL才能通过应用程序调用运行。应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。 隐式链接又称为静态加载&…