Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >计数排序

计数排序

作者头像
三猫
发布于 2020-11-03 03:03:11
发布于 2020-11-03 03:03:11
82200
代码可运行
举报
运行总次数:0
代码可运行
计数排序是典型排序算法之一,今天就来介绍一下计数排序,并通过LeetCode的1365题进行python实例演示。

1

概念

通常的排序算法是要进行元素之间的比较,而计数排序是记录下每个元素出现的个数,是一种空间换时间的排序方法。适合整数数组排序,并且不同元素个数不宜过多。

算法步骤如下:

  1. 扫描nums整个序列 ,获取最小值和最大值
  2. 建立中间数组,长度为 ( max - min + 1)
  3. 中间数组中 index 的元素记录的值是nums中某元素出现的次数
  4. 遍历中间数组,根据中间数组中的值及index与nums元素取值的对应关系,输出相应个数的元素

其中,第1、2步可以只取最大值并建立长度为max+1的中间数组,即从0开始记录每个数字出现的次数,但当最小值大于0很多时,会造成空间浪费。

(图片来自网络)

2

python实例展示

题目1365:有多少小于当前数字的数字

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

思路一:计数排序

建立中间数组记录每个值出现的次数,因为最后要输出的是小于某元素的所有数字个数,因此最后一步不是之间遍历输出,而是要把前面的出现次数相加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
        min_num = min(nums)
        #建立中间数组,记录每个值出现的次数
        #中间数组取值范围为[最小值-1,最大值]
        count_sort = [0]*(max(nums)-min_num+2)
        for i in range(0,len(nums)):
            count_sort[nums[i]-min_num+1]+=1
        #遍历中间数组,输出小于目标元素的元素个数
        result = []
        for i in range(0,len(nums)):
            result.append(sum(count_sort[0:nums[i]-min_num+1]))
        return(result)

思路二:哈希表

首先把nums进行排序,然后记录每个元素第一次出现的位置,那么就可以知道前面有几个数,即题目所求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
        nums_sort = sorted(nums)
        nums_hash = {}
        for i,item in enumerate(nums_sort):
            if item not in nums_hash:
                nums_hash[item] = i 
        result = []
        for i in range(0,len(nums)):
            result.append(nums_hash[nums[i]])
        return(result)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
万字长文|十大基本排序,一次搞定!
大家好,我是老三,一个刷不动算法的程序员。排序算法相关题目尽管在力扣中不是很多,但是面试中动不动要手撕一下。接下来,我们看一下十大基本排序,
三分恶
2021/09/08
5400
八十五、再探希尔排序,桶排序,计数排序和基数排序
关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排序,今天一口气把十大排序剩下的全部解决。
润森
2022/08/17
5420
八十五、再探希尔排序,桶排序,计数排序和基数排序
计数排序与桶排序python实现
计数排序与桶排序都是以牺牲空间换时间,虽然很快,但由于可能产生大量的空位置导致内存增大,尤其是计数排序。
py3study
2020/01/16
1.1K0
计数排序与桶排序python实现
十大经典排序算法的介绍及实现
两两比较,如果后面的数比前面的数小,就交换位置。每轮迭代,本轮最大的数就好像气泡一样一直滚动到数组的最末端,因而得名冒泡排序。优点是不占用额外空间,原地排序,并且是稳定的,代码简单容易理解。致命缺点是时间复杂度达到了 O(n^2) 。冒泡排序可以在算法中添加一个变量记录每轮迭代中是否发生位置交换,如果某一轮发现没有任何位置交换,说明数组已经是有序的,可以直接退出,无需再进行后续迭代了。
兜兜转转
2023/03/29
4280
十大经典排序算法的介绍及实现
计数排序详解
计数排序(CountSort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序) ————百度百科
用户11029129
2024/06/04
1360
计数排序详解
C++不知算法系列之细聊计数排序算法如何巧用计数
计数排序利用数组索引号的有序而对数据排序,所以,需要把原无序数组中的数据映射到排序数组的索引号上。于是,对排序数组的长度就会有一个最小值的约束,至少等于无序数组中的最大值加一。
一枚大果壳
2023/08/18
2270
C++不知算法系列之细聊计数排序算法如何巧用计数
计数排序(Counting Sort)详解
计数排序(Counting Sort)是一种非比较排序算法,其核心思想是通过计数每个元素的出现次数来进行排序,适用于整数或有限范围内的非负整数排序。这个算法的特点是速度快且稳定,适用于某些特定场景。在本文中,我们将深入探讨计数排序的原理、步骤以及性能分析。
修己xj
2023/10/05
4180
计数排序(Counting Sort)详解
理解计数排序算法的原理和实现
计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值。同样具有线性时间排序的算法还有桶排序和基数排序,这一点不要搞混。
我是攻城师
2018/10/19
1.6K0
理解计数排序算法的原理和实现
[数据结构]——非比较排序—计数排序
综上,计数排序在特定场景下(如数据范围不大、整数类型)是一种快速且高效的排序选择,但其适用场景相对有限,且空间效率较低。
小李很执着
2024/06/15
1240
[数据结构]——非比较排序—计数排序
计数排序算法
计数排序算法是一种典型的以空间换时间的一种算法。 这种算法主要是适合于正整数进行 排序。还是比较好理解的,而且在很多场合确实能提高效率。
一点一线
2022/03/22
5880
吐血整理--史上最全排序算法Python实现
一般排序算法最常考的:快速排序和归并排序。这两个算法体现了分治算法的核心观点,而且还有很多出题的可能。
宇宙之一粟
2020/10/26
3670
Python算法——计数排序
计数排序(Counting Sort)是一种非比较性排序算法,适用于对一定范围内的整数进行排序。它通过统计每个元素出现的次数,然后根据统计信息重新构建有序数组。计数排序是一种线性时间复杂度的排序算法,具有稳定性和适用性广泛的特点。本文将详细介绍计数排序的工作原理和Python实现。
Echo_Wish
2023/11/30
3200
【初阶数据结构】计数排序 :感受非比较排序的魅力
如果大家仔细思考的话,可能会发现这么一个问题。我们学的七大排序(冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序)都是通过数组中元素之间比较进行数组中数字挪动,从而达到排序的目的。
埋头编程
2024/10/20
1420
【初阶数据结构】计数排序 :感受非比较排序的魅力
Python实现常见的排序算法
本章介绍使用Python实现场景的几种排序算法。分别有冒泡算法、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排序、桶排序、基数排序。
夜雨飘零
2020/06/02
4780
数据结构与算法之十大经典排序算法
排序算法是计算机程序设计中的基础算法之一,排序算法作用是将一个无序序列排序成有序序列。
仲君Johnny
2024/01/24
1510
数据结构与算法之十大经典排序算法
Python 算法基础篇:堆排序和计数排序
堆排序和计数排序是两种高效的排序算法,用于将一个无序列表按照特定顺序重新排列。本篇博客将介绍堆排序和计数排序的基本原理,并通过实例代码演示它们的应用。
小蓝枣
2023/07/24
1430
Python实现排序算法
本章介绍使用Python实现场景的几种排序算法。分别有冒泡算法、快速排序、插入排序、希尔排序、选择排序、堆排序、归并排序、计数排序、桶排序、基数排序。
用户3577892
2020/06/11
5240
【初阶数据结构篇】归并排序和计数排序(总结篇)
gitee 前篇:【初阶数据结构篇】插入、希尔、选择、堆排序介绍 中篇:【初阶数据结构篇】冒泡排序和快速排序
半截诗
2024/10/09
870
【初阶数据结构篇】归并排序和计数排序(总结篇)
漫画:什么是计数排序?
计数排序(Counting Sort)是一种针对于特定范围之间的整数进行排序的算法。它通过统计给定数组中不同元素的数量(类似于哈希映射),然后对映射后的数组进行排序输出即可。
五分钟学算法
2020/08/21
4500
漫画:什么是计数排序?
十大排序——最全最详细,一文让你彻底搞懂
(注:文章中的算法顺序是按照下面的图片中的分类进行,你可以不按照这个顺序。根据你的个人喜好、时间以及上面的侧重点分析,按照自己的需求学习即可。)
全栈程序员站长
2022/09/15
9680
十大排序——最全最详细,一文让你彻底搞懂
相关推荐
万字长文|十大基本排序,一次搞定!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验