排序算法-计数排序

一、计数排序

       这种排序算法 是利用数组下标来确定元素的正确位置的。

      如果数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。

    9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9

   考虑到这些整数只能够在0、1、2、3、4、5、6、7、8、9、10这11个数中取值,取值范围有限。可以根据这有限的范围,建立一个长度为11的数组。数组下标从0到10,元素初始值全为0

    下面就开始遍历这个无序的随机数列,每一个整数按照其值对号入座,同时对应数组下标元素进行加1操作。

    根据这个统计结果,排序就很简单了。直接遍历数组,输出数组元素的下标 值,元素的值是几,就输出几次: 0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10

    计数排序的基本过程,它适用于一定范围内的整数排序。在取值范围不是 很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。

def countSort(ll):# 1.得到数列的最大值max=ll[0]for i in range(1,len(ll)):if ll[i]>max:max=ll[i]# print(max)# 2.根据数列最大值确定统计数组大小,并赋值0;arrs=[0]*(max+1)print(arrs)# 3.遍历数列,填充统计数组for i in range(len(arrs)):arrs[ll[i]]+=1print(arrs)# 4.遍历数列sorted_arrs=[]for i in range(len(arrs)):for j in range(0,arrs[i]):# print(i)sorted_arrs.append(i)#返回排序数组return sorted_arrsif __name__ == '__main__':ll=[9,3,5,4,9,1,2,7,8,1,10]print(ll)print(countSort(ll))

 

以上是找数列的最大值来决定统计数组的长度,其实并不严谨 。

如: 96,93,91,94,95,90,99, 93,91,90

这个数列的最大值是99,但最小的整数是90。如果创建长度为100的数组,那么前面从0到89的空间位置就都浪费了!

    很简单,只要不再以输入数列的最大值+1作为统计数组的长度,而是以数列最大值-最小值+1作为统计数组的长度即可。 同时数列的最小值作为一个偏移量,用于计算整数在统计数组中的下标。 

统计出数组的长度:99-90+1=10,偏移量等于数列的最小值90对于第1个整数96,对应的统计数组下标是96-90=6

如下图所示: 同时数列的最小值作为一个偏移量,用于计算整数在统计数组中的下标。 

 如果学生成绩表,要求按成绩从低到高进行排序,如果成绩相同,则遵循原表固有顺序。

 如图所示:

这是变形,其实就是从统计数组的第2个元素开始,每一个元素都加上前面所有元素之和。 

步骤1:遍历成绩表最后一行的小绿同学的成绩。

小绿的成绩是95分,找到count_array下标是5的元素,值是4,代表小绿的成绩排名位置在第4位。 同时,给count_array下标是5的元素值减1,从4变成3,代表下次再遇到95分的成绩时,最终排名是第3。 

 

步骤2:遍历成绩表倒数第二行的小白同学的成绩。 

 

步骤3:遍历成绩表倒数第三行的小红同学的成绩。  

 

重复上面的步骤继续完成! 

'''优化'''
def countSort2(ll):# 1.得到数列的最大值,最小值max=ll[0]min=ll[0]for i in range(1,len(ll)):if ll[i]>max:max=ll[i]if ll[i]<min:min=ll[i]#差值diff=max-min# print(diff)# 2.确定统计数组大小,并赋值0;arrs=[0]*(diff+1)# print(arrs)# 3.遍历数列,填充统计数组for i in range(len(ll)):arrs[ll[i]-min]+=1   #如:95-90=5,94-90=4print(arrs)# 4.统计数组变形,从第二个元素开始,后面的元素等于前面的元素之和for i in range(1,len(ll)):arrs[i]+=arrs[i-1]  #1+2,3+1,4+1...print(arrs)# 5.排序数列sorted_arrs=[0]*len(ll)# 倒序遍历原始数列,从统计数组找到正确位置for i in range(len(ll)-1,-1,-1):sorted_arrs[arrs[ll[i]-min]-1]=ll[i]  #92-90-1=1;1是排序数列下标,再将对应原始数据最后一个赋值到这个下标。arrs[ll[i] - min] -= 1    #arrs[92-90]-1=arrs[2]-1=1# #返回排序数组return sorted_arrsif __name__ == '__main__':ll = [95,94,91,98,99,90,99,93,91,92]print(ll)print(countSort2(ll))

计数排序有它的局限性,主要表现两点:

1、当数列最大和最小值差距过大时,并不适合用计数排序。

    如:给出20个随机整数,范围在0到1亿之间,这时如果使用计数排序,需要创建长度为1亿的数组。不但严重浪费空间,而且时间复杂度也会随之升高。

2、当数列元素不是整数时,也不适合用计数排序。

  如果数列中的元素都是小数,如25.213或0.000001这样的数字,则无法创建对应的统计数组。

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

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

相关文章

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例&#xff0c;可能看着比较复杂也不知道是啥意思&#xff1b; 今天从理论入手重新认识下&#xff01; 一、基本认识 首先&#xff0c;我们先了解下基础术语&#xff1a; 图(Graph)&…

python coverage如何使用

Python的coverage.py是一个测量代码覆盖率的工具&#xff0c;它可以告诉你在测试中哪些代码被执行了&#xff0c;哪些没有。这对于确保你的测试覆盖了所有情况非常有用。以下是如何使用coverage.py的基本步骤&#xff1a; ### 安装 首先&#xff0c;你需要安装coverage.py。你…

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中&#xff0c;声卡作为多媒体系统的核心组件&#xff0c;扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号&#xff0c;进而输出到各类声响设备&#xff0c;更能够通过音乐设备数字接口(MIDI)发出合成乐器的…

Eudic欧路词典for Mac:专业英语学习工具

Eudic欧路词典for Mac&#xff0c;作为专为Mac用户设计的英语学习工具&#xff0c;凭借其简捷高效的特点&#xff0c;成为众多英语学习者不可或缺的助手。 Eudic欧路词典for Mac v4.6.4激活版下载 这款词典整合了多个权威词典资源&#xff0c;如牛津、柯林斯、朗文等&#xff0…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

mysql中日期函数now()和sysdate()的区别

说明&#xff1a; 在mysql数据库中&#xff0c;now()、sysdate() 都是获取系统当前日期时间 区别&#xff1a; 示例脚本&#xff1a; select sleep(2),now(),sysdate() from dual; 输出&#xff1a; 小结&#xff1a; 1、 now()和sysdate()都可以获取系统当前日期时间 2、区别…

第30篇 RPC概述

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种编程技术&#xff0c;使得开发者能够像调用本地函数一样调用位于不同进程、不同主机上的函数或服务。这种技术隐藏了底层网络通信细节&#xff0c;使得分布式系统中的组件能够无缝协作&#xf…

【无标题】getchar gets scanf

getchar与putchar的用法 getchar一次只接收一个字符 #include<stdio.h>int main() { char ch 0;while ((ch getchar()) ! \n){putchar(ch);} } #include <stdio.h> #define SPACE // SPACE表示一个空格字符 int main() { char ch; ch getch…

优化SQL的方法

来自组内分享&#xff0c;包含了比较常使用到的八点&#xff1a; 避免使用select * union all代替union 小表驱动大表 批量操作 善用limit 高效的分页 用连接查询代替子查询 控制索引数量 一、避免使用select * 消耗数据库资源 消耗更多的数据库服务器内存、CPU等资源。 消…

训练深度神经网络,使用反向传播算法,产生梯度消失和梯度爆炸问题的原因?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 反向传播是神经网络训练的精髓。它是根据上一个迭代获得的误差&#xff08;即损失&#xff09;对神经网络的权重进行微调的做法。权重的适当调整可确保较低的误差&#xff0c;从而通过提高模型的泛化能…

Android Glide 获取动图的第一帧

一、说明 Glide 可以加载 2 种动图&#xff0c;一种是 Gif 图&#xff0c;另一种是 Webp 动图。 有时候我们需要获取动图的第一帧&#xff0c;并以封面的形式显示&#xff0c;那该怎样获取呢&#xff1f; 二、获取 Webp 第一帧 我这儿的 Webp 显示用到了一个三方库&#xf…

【LLM】系统的评估与优化

文章目录 系统的评估与优化评估 LLM 应用的方式人工评估简单自动评估使用大模型进行评估混合评估 评估并优化生成部分提升直观回答质量标明知识来源&#xff0c;提高可信度构造思维链增加一个指令解析 评估并优化检索部分评估检索效果优化检索的思路 思考对比各种LLM评估方法的…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言&#xff1a; 近年来&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中&#xff0c;.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点&#xff0c;并提出相…

实现SpringMVC底层机制(一)

文章目录 1.环境配置1.创建maven项目2.创建文件目录3.导入jar包 2.开发核心控制器文件目录1.流程图2.编写核心控制器SunDispatcherServlet.java3.类路径下编写spring配置文件sunspringmvc.xml4.配置中央控制器web.xml5.配置tomcat&#xff0c;完成测试1.配置发布方式2.配置热加…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持&#xff0c;stomp协议作为websocket的子协议&#xff0c;Spring也做了很多封装&#xff0c;让我们在开发中易于使用。 学习使用Spring的Websocket模块&#xff0c;当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

采集 Kubernetes 容器日志最佳实践

前言 指标、日志、链路是可观测的三大支柱&#xff0c;日志主要用于记录代码执行的痕迹&#xff0c;方便定位和排查问题。当前主流的应用都是以容器的方式运行在 Kubernetes 集群&#xff0c;由于容器的动态性&#xff0c;容器可能会频繁地创建和销毁。日志的采集和持久化变得…

用例整体执行及pytest.ini文件

在我们写代码的过程中&#xff0c;一般都是右键或者命令行去执行一个用例 但是当我们写完后&#xff0c;需要整体执行一遍。那应该怎么搞呢&#xff1f; 我们可以在根目录下新建一个main.py或者run.py之类的文件&#xff0c;文件内容如下&#xff1a; if __name__ "__ma…

Android --- SQlite数据存储

使用 SQLite 保存数据 | Android Developers (google.cn) SQLiteOpenHelper 类包含一组用于管理数据库的实用 API。当您使用此类获取对数据库的引用时&#xff0c;系统仅在需要时才执行可能需要长时间运行的数据库创建和更新操作&#xff0c;而不是在应用启动期间执行。您仅…

4-用户权限控制(后端)

在计算机系统中&#xff0c;用户权限控制是一种机制&#xff0c;用于限制用户对系统资源的访问和操作。它可以确保只有经过授权的用户可以执行特定的操作&#xff0c;并限制未经授权的用户的访问权限。 用户权限控制通常涉及以下几个方面&#xff1a; 用户认证&#xff1a;用户…