数据结构与算法Python版:计数排序

简介:计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), 如归并排序,堆排序)。

历史攻略:

Python基础入门 1 - 230题

Golang基础练习 1 - 40题

算法思想:

计数排序对输入的数据有附加的限制条件:

1、输入的线性表的元素属于有限偏序集S;

2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。

在这两个条件下,计数排序的复杂性为O(n)。

计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。

Python语言描述:

def count_sort(input_list):length = len(input_list)if length < 2:return input_listmax_num = max(input_list)count = [0] * (max_num + 1)for element in input_list:count[element] += 1output_list = []for i in range(max_num + 1):for j in range(count[i]):  # count[i]表示元素i出现的次数,如果有多次,通过循环重复追加        output_list.append(i)return output_list

案例源码:5题

# -*- coding: utf-8 -*-
# time: 2023/12/17 10:18
# file: count_sort_demo.py
# 公众号: 玩转测试开发from typing import List# 1051. 高度检查器
# 学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照非递减的高度顺序排成一行。
# 排序后的高度情况用整数数组expected表示,其中expected[i]是预计排在这一行中第i位的学生的高度(下标从0开始)。
# 给你一个整数数组heights ,表示当前学生站位的高度情况。heights[i]是这一行中第i位学生的高度(下标从0开始)。
# 返回满足heights[i] != expected[i]的下标数量 。
#
# 示例1:输入:heights = [1, 1, 4, 2, 1, 3]
# 输出:3
# 解释:
# 高度:[1, 1, 4, 2, 1, 3]
# 预期:[1, 1, 1, 2, 3, 4]
# 下标
# 2 、4 、5
# 处的学生高度不匹配。
# 示例2:
# 输入:heights = [5, 1, 2, 3, 4]
# 输出:5
# 解释:
# 高度:[5, 1, 2, 3, 4]
# 预期:[1, 2, 3, 4, 5]
# 所有下标的对应学生高度都不匹配。
# 示例3:
# 输入:heights = [1, 2, 3, 4, 5]
# 输出:0
# 解释:
# 高度:[1, 2, 3, 4, 5]
# 预期:[1, 2, 3, 4, 5]
# 所有下标的对应学生高度都匹配。class Solution1051:def heightChecker(self, heights: List[int]) -> int:# 先赋值给其他# 排序本身# 遍历对比n = heights[:]heights.sort()count = 0for i, v in enumerate(n):if v != heights[i]:count += 1return counts1051 = Solution1051()
r1051 = s1051.heightChecker([1, 1, 4, 2, 1, 3])
print(f"r1051:{r1051}")  # r1051:3# 561. 数组拆分
# 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,
# 使得从 1 到 n 的 min(ai, bi) 总和最大。
# 返回该 最大总和 。
# 示例 1:
# 输入:nums = [1,4,3,2]
# 输出:4
# 解释:所有可能的分法(忽略元素顺序)为:
# 1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
# 2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
# 3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
# 所以最大总和为 4
# 示例 2:
# 输入:nums = [6,2,6,5,1,2]
# 输出:9
# 解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9class Solution561:def arrayPairSum(self, nums: List[int]) -> int:# 排序。一次22取。排序后,双数位为最小。隔取求和nums.sort()count = int(len(nums) / 2)return sum([i for i in nums[0::2]])s561 = Solution561()
r561 = s561.arrayPairSum([1, 1, 4, 2, 1, 3])
print(f"r561:{r561}")  # r561:5# 1122. 数组的相对排序
# 给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
# 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。
# 未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
# 示例 1:
# 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
# 输出:[2,2,2,1,4,3,3,9,6,7,19]
# 示例  2:
# 输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
# 输出:[22,28,8,6,17,44]class Solution1122:def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:# 字典:arr1的元素和个数# 遍历arr2,将符合的全部加入结果列表。加入后移除字典中对应的键值对。# 遍历字典。将剩余的值重新排序,并入结果列表import collectionstmp_dict = dict(collections.Counter(arr1))result = []for i in arr2:if i in tmp_dict:loop = tmp_dict[i]for count in range(loop):result.append(i)tmp_dict.pop(i)others = [k for k, v in tmp_dict.items() for i in range(v)]others.sort()return result + otherss1122 = Solution1122()
r1122 = s1122.relativeSortArray([2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19], [2, 1, 4, 3, 9, 6])
print(f"r1122:{r1122}")  # r1122:[2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]# 912. 排序数组
# 给你一个整数数组 nums,请你将该数组升序排列。
# 示例 1:
# 输入:nums = [5,2,3,1]
# 输出:[1,2,3,5]
# 示例 2:
# 输入:nums = [5,1,1,2,0,0]
# 输出:[0,0,1,1,2,5]class Solution912:def sortArray(self, nums: List[int]) -> List[int]:return sorted(nums)s912 = Solution912()
r912 = s912.sortArray([2, 1, 4, 3, 9, 6])
print(f"r912:{r912}")  # r912:[1, 2, 3, 4, 6, 9]# 274. H 指数
# 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
# 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,
# 并且 至少 有 h 篇论文被引用次数大于等于 h 。如果 h 有多种可能的值,h 指数 是其中最大的那个。
# 示例 1:
# 输入:citations = [3,0,6,1,5]
# 输出:3
# 解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
# 由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
# 示例 2:
# 输入:citations = [1,3,1]
# 输出:1class Solution274:def hIndex(self, citations: List[int]) -> int:loop = len(citations)if sum(citations) == 0:return 0if loop == 1:return 1for i in range(loop, 0, -1):if sum([1 for j in citations if j >= i]) >= i:return is274 = Solution274()
r274 = s274.hIndex([2, 1, 4, 3, 9, 6])
print(f"r274:{r274}")  # r274:3

运行结果:

r1051:3
r561:5
r1122:[2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]
r912:[1, 2, 3, 4, 6, 9]
r274:3

总结:计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置。因此,计数排序算法不是一个基于比较的排序算法,从而它的计算时间下界不再是O(nlogn)。另一方面,计数排序算法之所以能取得线性计算时间的上界是因为对元素的取值范围作了一定限制,即k=O(n)。如果k=n2,n3,…,就得不到线性时间的上界。此外,我们还看到,由于算法第4行使用了downto语句,经计数排序,输出序列中值相同的元素之间的相对次序与他们在输入序列中的相对次序相同,换句话说,计数排序算法是一个稳定的排序算法。

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

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

相关文章

如何利用ssh将手机连接电脑

首先我们需要下载ssh&#xff0c;因为我们没有安装 sshd 命令意思是开启ssh 下载完以后要设置密码&#xff0c;我设置得是 123456 开启服务&#xff0c;查看ip 电脑连接 ssh 刚刚得ip -p 8022 后面就连接上了 我可以在这里启动我手机上的vnc

UG装配-爆炸图

当我们将零件装配成总成的时候&#xff0c;通常需要绘制爆炸图来说明总成零件组成&#xff0c;需要用到爆炸图命令&#xff0c;首先点击新建爆炸&#xff0c;然后为爆炸图命名 然后我们可以选择编辑爆炸或者自动爆炸&#xff1a; 编辑爆炸是通过手动的方式选择部件&#xff0c…

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别&#xff1f;5.302和304有什么区别&#xff1f;6. 请描述一次完整的HTTP请求的过程。7.什么是重定向&#xff1f;8. 重定向和请求转发有什么区别&#xff1f;9.介绍…

Java研学-Servlet3.0文件上传下载

一 文件上传 1 介绍 用户选择本地文件资源保存到服务器上&#xff0c;Servlet需要将二进制数据以文件保存到服务器磁盘中&#xff0c;再将磁盘路径保存到数据库中 2 项目搭建 创建web项目&#xff0c;并添加对应jar包(JSTL) 3 API HttpServletRequest 方法–从请求中解析上…

DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选

参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…

ARM CCA机密计算架构软件栈之软件组件介绍

在本节中,您将了解Arm CCA的软件组件,包括Realm World和Monitor Root World。以下图表展示了Arm CCA系统中的软件组件: 在这个图表中,世界之间的边界显示为粗虚线。由较高权限的软件强制执行的较低权限软件组件之间的边界显示为细虚线。例如,非安全EL2处的虚拟机监视器强制…

python项目使用docker的方式部署,docker compose的方式启动

要将 Python 项目打包并发布到 Docker Hub&#xff0c;然后使用 Docker Compose 部署到正式环境&#xff0c;您需要执行以下步骤&#xff1a; 打包 Python 项目并发布到 Docker Hub 创建 Dockerfile: 确保您已经有一个适用于您的 Python 项目的 Dockerfile。这个文件定义了如何…

Leetcode 3003. Maximize the Number of Partitions After Operations

Leetcode 3003. Maximize the Number of Partitions After Operations 1. 解题思路2. 代码实现 题目链接&#xff1a;10038. Maximize the Number of Partitions After Operations 1. 解题思路 这一题我看实际比赛当中只有72个人做出来&#xff0c;把我吓得够呛&#xff0c;…

pip install simctg 报错

pip install simctg python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [15 lines of output] The ‘sklearn’ PyPI package is deprecated, use ‘scikit-learn’ rather than ‘sklearn’ for pip commands. Here is how to fix this error i…

【win11 绕过TPM CPU硬件限制安装】

Qt编程指南 VX&#xff1a;hao541022348 ■ 下载iso文件■ 右键文件点击装载出现如下问题■ 绕过TPM CPU硬件限制安装方法■ 虚拟机安装win11 ■ 下载iso文件 选择Windows11 &#xff08;multi-edition ISO&#xff09;在选择中文 ■ 右键文件点击装载出现如下问题 ■ 绕过T…

Ubuntu下Lighttpd服务器安装,并支持PHP

1、说明 Lighttpd 是一个德国人领导的开源Web服务器软件&#xff0c;其根本的目的是提供一个专门针对高性能网站&#xff0c;安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。 Lighttpd是众多OpenSource轻量级…

New!2024最新ChatGPT提示词开源项目:GPT Prompts Hub - 专注于深化对话质量和探索更复杂的对话结构

&#x1f31f; GPT Prompts Hub &#x1f31f; 欢迎来到 “GPT Prompts Hub” 存储库&#xff01;探索并分享高质量的 ChatGPT 提示词。培养创新性内容&#xff0c;提升对话体验&#xff0c;激发创造力。我们极力鼓励贡献独特的提示词。 在 “GPT Prompts Hub” 项目中&#…

Docker安装sentinel控制台

1、拉取镜像&#xff0c;直接使用run命令&#xff0c;如果说本地没有镜像就会直接去远程仓库拉取&#xff1a; docker run -d \ -p 8858:8858 \ --name sentinel-dashboard \ --network demo \ -e AUTH_USERNAMEsentinel \ -e AUTH_PASSWORD123456 \ bladex/sentinel-dashboa…

特征工程(一)

特征工程&#xff08;一&#xff09; 什么是特征工程 简单来讲将数据转换为能更好地表示潜在问题的特征&#xff0c;从而提高机器学习性能 特征工程包含的内容 转换数据的过程特征更好地表示潜在问题提高机器学习性能 数据和机器学习的基础知识 数据基础 以下为数据的一…

使用 Windows 调试器查找 GDI 泄漏

文章目录 介绍为什么!htrace命令无法使用?总结附:GDI使用的几个注意点:本文将带您了解如何使用 Windows 调试器跟踪 GDI 句柄泄漏,并了解如何修复它们。 介绍 本文是有关使用 Windows 调试器查找和修复 GDI 句柄泄漏的演练。Windows调试器应该是最后的手段,首先在整个代…

密码学:一文读懂非对称密码体制

文章目录 前言非对称密码体制的保密通信模型私钥加密-公钥解密的保密通信模型公钥加密-私钥解密的保密通信模型 复合式的非对称密码系统散列函数数字签名数字签名满足的三个基本要求先加密还是先签名&#xff1f;数字签名成为公钥基础设施以及许多网络安全机制的基础什么是单向…

STM32 基础知识(探索者开发板)--115讲 OLED

引用http://t.csdnimg.cn/hV6Ox 该函数中 void oled_refresh_gram(void) {uint8_t i, n;for (i 0; i < 8; i){oled_wr_byte (0xb0 i, OLED_CMD); /* 设置页地址&#xff08;0~7&#xff09; */oled_wr_byte (0x00, OLED_CMD); /* 设置显示位置—列低地址 */oled_wr…

桃花谷之恋

在一个古老而神秘的山林之中&#xff0c;有一片被人们称之为“桃花谷”的地方。这里四季如春&#xff0c;桃花盛开&#xff0c;美不胜收。然而&#xff0c;传说中&#xff0c;桃花谷深处隐藏着一个神秘的秘密——那是一个充满了桃花妖的世界。 在这片桃花谷中&#xff0c;有一…

图表征模型研究

图表征对于知识图谱是很重要的&#xff0c;如何将图进行embedding&#xff0c;并输入到深度学习模型中&#xff0c;是一个热点问题。 1. GraphSage模型 主要应用于同构图中&#xff0c;是一种归纳式的图表征模型&#xff0c;首先从一个图中训练出embedding方法&#xff0c;在…

19.Linux Shell任务控制

文章目录 Linux Shell任务控制1)信号通过键盘生成信号trap 命令捕获信号 2)在后台运行脚本命令后加 & 符使用nohub命令 3)作业控制4)调度优先级nice命令renice 命令 5)定时运行作业at定期执行命令reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x…