首页 > 编程语言 >Python算法——计数排序

Python算法——计数排序

时间:2023-12-14 11:00:49浏览次数:27  
标签:arr val min Python 计数 数组 排序

计数排序(Counting Sort)是一种非比较性排序算法,适用于对一定范围内的整数进行排序。它通过统计每个元素出现的次数,然后根据统计信息重新构建有序数组。计数排序是一种线性时间复杂度的排序算法,具有稳定性和适用性广泛的特点。本文将详细介绍计数排序的工作原理和Python实现。

计数排序的工作原理

计数排序的基本思想是:
  1. 统计数组中每个元素出现的次数,得到元素的频率统计信息。
  2. 根据频率统计信息,重建有序数组。 计数排序的关键在于如何统计元素的频率以及如何重建有序数组。计数排序适用于整数排序,特别适用于有限范围内的整数排序。
下面是一个示例,演示计数排序的过程:

原始数组:[4, 2, 2, 8, 3, 3, 1]

  1. 统计数组中每个元素出现的次数,得到频率统计信息:{1: 1, 2: 2, 3: 2, 4: 1, 8: 1}。
  2. 根据频率统计信息,重建有序数组:[1, 2, 2, 3, 3, 4, 8]。

Python实现计数排序

下面是Python中的计数排序实现:

def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_val = max_val - min_val + 1

    # 初始化计数数组
    count = [0] * range_val

    # 统计元素频率
    for num in arr:
        count[num - min_val] += 1

    # 重建有序数组
    result = []
    for i in range(range_val):
        result.extend([i + min_val] * count[i])

    return result
  • arr 是待排序的整数数组。
  • max_val 和 min_val 分别是数组的最大值和最小值。
  • range_val 表示元素范围的大小。
  • 初始化计数数组 count,用于统计每个元素出现的次数。
  • 统计元素频率,注意需要将元素减去最小值以适配计数数组。
  • 重建有序数组,根据计数数组信息构建有序数组。
示例代码

下面是一个使用Python进行计数排序的示例代码:

def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_val = max_val - min_val + 1

    count = [0] * range_val

    for num in arr:
        count[num - min_val] += 1

    result = []
    for i in range(range_val):
        result.extend([i + min_val] * count[i])

    return result

# 测试排序
arr = [4, 2, 2, 8, 3, 3, 1]
sorted_arr = counting_sort(arr)
print("排序后的数组:", sorted_arr)
时间复杂度

计数排序的时间复杂度为 O(n + k),其中 n 是数组的长度,k 是元素范围的大小。计数排序是一种非比较性排序算法,适用于整数排序,特别适用于有限范围内的整数排序。

总之,计数排序是一种高效的非比较性排序算法,通过统计每个元素的频率,重建有序数组,实现了对整数数组的排序。了解计数排序有助于理解非比较性排序算法的思想,并为特定场景提供了一个高效的排序解决方案。

标签:arr,val,min,Python,计数,数组,排序
From: https://blog.51cto.com/u_16295743/8816017

相关文章

  • python使用paillier过程中遇到的问题及解决方案记录
    OverflowError:Overflowdetectedindecryptednumber错误表明在解密操作中检测到了溢出。这可能是由于解密的结果超过了Paillier密码系统的容量。以下是一些可能导致溢出的原因和解决方法:密钥长度不足:密钥长度决定了可以处理的数字范围。如果你使用的是较短的密钥,它可......
  • python中协程并发io等待
    importasyncioimporttimeasyncdefa():start_time=time.time()print("函数a开始执行")tasks=[asyncio.create_task(b())]#创建一个任务列表,包含函数b的任务print("函数a执行其他操作")awaitasyncio.sleep(14)#休眠1秒print("函数a执行完......
  • Python实现软件设计模式1:简单工厂/静态工厂模式
    包含的角色工厂角色Factory静态方法抽象产品角色Product声明公用的抽象方法和属性具体产品角色ConcreteProduct覆盖抽象产品中声明的方法,多种产品多种覆盖模式特点可以降低系统耦合度,使用工厂方法时无需知道对象创建细节,传入工厂类的参数可以是字......
  • SQL中的排序中的排序
    SQL中的排序中的排序任务表,有个需求,排序按照重要程序排序,在重要的任务里按照更新时间来排序,然后在不重要的任务里按照ID来排序,解决如下: selecta.id,a.title,a.isimport,a.updatetimefrom(select*frommubiaoswhereisimport=1unionselect*frommubia......
  • 【Python爬虫】Scrapy框架处理分页爬取+cookie登录_17k小说网
    简介本文主要讲常规分页爬取与利用Scrapy框架怎么快捷的爬取分页的数据以及cookie登录,案例网站时17k小说网,url是https://www.17k.com/常规分页爬取Scrapy框架分页爬取cookie登录分页常规分页爬取常规分页爬取,直接观察页面数据,一共有多少页数据,就for循环多少次classXiao......
  • 12.14——python类
    classEmployee:  up=0.1    def__init__(self,name,salary):    #构造器__init__    self.username=name#实例变量    self.salary=salary1          defup_salary(self):#self表示......
  • 使用Python和Qt6(PySide6)创建GUI应用1简介
    1简介在本书从GUI开发的基本原理逐步过渡到使用PySide6创建您自己的、功能齐全的桌面应用程序。1.1GUI简史图形用户界面(GUIGraphicalUserInterface)历史悠久,可追溯到20世纪60年代。斯坦福大学的NLS(ON-Line系统引入了鼠标和窗口概念,并于1968年首次公开展示。随后,施乐公司......
  • python 将 .pdf 文件转为 .md
    方法一:工具网站https://pdf2md.morethan.io/方法二:代码手动转换pipinstallaspose-wordsdoc=aw.Document(r"pdf文件路径\xxx.pdf")doc.save("Output.md")来源:https://products.aspose.com/words/zh/python-net/conversion/—————————————......
  • python之tkinter的grid布局
    grid将界面划分为二维网格,由行和列分割,从上到下,左到右编号,最左上角是(0,0),依次类推。也可结合frame使用,形成更加复杂的界面。语法:grid(argus……)参数:参数属性举例或备注                             row定位组件在第几行 column定位组件在第几列......
  • 使用java调用Python脚本
    通过使用java中的ProcessBuilder类,可以实现在java代码中调用外部的python代码的功能,以下为具体代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassJavaCallPython{publicstaticvoidmain(String[]args)......