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

简介: Python3 数据结构与算法之计数排序

本文讲述一个在编程过程中并不是很常见的一种排序算法——计数排序。


计数排序

根据这个排序的名字,我们不难想到该排序的主体就在于计数二字上,那么具体有什么数字需要我们记录呢,下面通过一个例子来简单的说明一下。

这里给定一个数组:

arr = [2, 3, 5, 14, 5, 7, 22, 7, 7, 11]

我们能看到一个数组中的数字不仅是大小不一的,还有可能是重复的,既然有重复的数据,那么我们就先来讲这些重复的数据找出来并做一定的标记。


我们既想要记录每个数字是多少又想要记录出现的次数,你可能会想到二维数组、字典等等的数据结构,我在这里给出一个很简单的思想用一个一维数组解决这个问题,首先我们定义一个长度为max(arr)-min(arr)+1的数组countArr,有个这个较长的数组后,我们就可以用索引来表示数字的值用数组的空间去存储该值出现的次数,来用代码实现以下这个操作:

    maxnum = max(arr)
    minnum = min(arr)
    countArr_length = maxnum - minnum + 1
    countArr = [0 for i in range(countArr_length)]
    # 统计每个数字出现的次数,存在计数数组中。
    for i in arr:
        countArr[i - minnum] += 1

每一次循环的结果如下:

12.png

有了这个数组,我们只需要将每个数在一个新的数组中填入到他们相应的位置并输出即可,全部代码如下:

def count_sort(arr):
    maxnum = max(arr)
    minnum = min(arr)
    countArr_length = maxnum - minnum + 1
    countArr = [0 for i in range(countArr_length)]
    res = [0 for i in range(len(arr))]
    # 统计每个数字出现的次数,存在计数数组中。
    for i in arr:
        countArr[i - minnum] += 1
    # 统计每个数字前面有几个比自己小的数,并更新到计数数组中。
    for j in range(1, countArr_length):
        countArr[j] = countArr[j] + countArr[j - 1]
    # 根据每个数字前面有几位比自己小的数的个数进行输出。
    for k in range(len(arr)):
        res[countArr[arr[k] - minnum] - 1] = arr[k]
        countArr[arr[k] - minnum] -= 1
    return res
arr = [2, 3, 5, 14, 5, 7, 22, 7, 7, 11]
print(count_sort(arr))

排序结果如下:

13.png

说明一下代码中最后一个循环中的内容:


res[countArr[arr[k] - minnum] - 1] = arr[k],该步骤用于寻找数字arr[k]之前有几个比他的数字n,并把数字arr[k]放在n-1的位置上(-1是因为索引需要从0开始)。


countArr[arr[k] - minnum] -= 1,该步骤将上一步中排序好的数字弹出再集训进行循环。


复杂度:

假定原始数列的规模是N,最大值和最小值的差是M,计数排序的时间复杂度是O(N+M),如果不考虑结果数组,只考虑中间数组大小的话,空间复杂度是O(M)。


计数排序的局限性:

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

2、当数列元素不是整数,并不适用计数排。

相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
106 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
12天前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
4天前
|
机器学习/深度学习 人工智能 算法
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
服装识别系统,本系统作为图像识别方面的一个典型应用,使用Python作为主要编程语言,并通过TensorFlow搭建ResNet50卷积神经算法网络模型,通过对18种不同的服装('黑色连衣裙', '黑色衬衫', '黑色鞋子', '黑色短裤', '蓝色连衣裙', '蓝色衬衫', '蓝色鞋子', '蓝色短裤', '棕色鞋子', '棕色短裤', '绿色衬衫', '绿色鞋子', '绿色短裤', '红色连衣裙', '红色鞋子', '白色连衣裙', '白色鞋子', '白色短裤')数据集进行训练,最后得到一个识别精度较高的H5格式模型文件,然后基于Django搭建Web网页端可视化操作界面,实现用户在界面中
20 1
【服装识别系统】图像识别+Python+人工智能+深度学习+算法模型+TensorFlow
|
5天前
|
算法 安全 网络安全
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。
|
5天前
|
存储 算法 搜索推荐
|
11天前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
19 4
|
11天前
|
存储 Python
Python中使用列表和字典来存储和处理复杂的数据结构
Python中使用列表和字典来存储和处理复杂的数据结构
|
12天前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
12天前
|
存储 索引 Python
Python的内置数据结构
Python的内置数据结构
|
4天前
|
机器学习/深度学习 人工智能 算法
【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法
坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实('杏仁', '巴西坚果', '腰果', '椰子', '榛子', '夏威夷果', '山核桃', '松子', '开心果', '核桃')等图片数据集进行训练,得到一个识别精度较高的模型文件,让后使用Django搭建Web网页端界面操作平台,实现用户上传一张坚果图片 识别其名称。
9 0