当前位置: 首页 > article >正文

leetcode计数排序

计数排序(counting sort)通过统计元素数量来实现排序,通常应用于整数数组。
给定一个长度为 的数组 nums ,其中的元素都是“非负整数”

遍历数组,找出其中的最大数字,记为 ,然后创建一个长度为
的辅助数组 counter 。
借助 counter 统计 nums 中各数字的出现次数,其中 counter[num] 对应数字 num 的出现次数。统计方法很简单,只需遍历 nums(设当前数字为 num),每轮将 counter[num] 增加
即可。
由于 counter 的各个索引天然有序,因此相当于所有数字已经排序好了。接下来,我们遍历 counter ,根据各数字出现次数从小到大的顺序填入 nums 即可
在这里插入图片描述

def counting_sort(nums: list[int]):
    """计数排序"""
    # 完整实现,可排序对象,并且是稳定排序
    # 1. 统计数组最大元素 m
    m = max(nums)
    # 2. 统计各数字的出现次数
    # counter[num] 代表 num 的出现次数
    counter = [0] * (m + 1)
    for num in nums:
        counter[num] += 1
    # 3. 求 counter 的前缀和,将“出现次数”转换为“尾索引”
    # 即 counter[num]-1 是 num 在 res 中最后一次出现的索引
    for i in range(m):
        counter[i + 1] += counter[i]
    # 4. 倒序遍历 nums ,将各元素填入结果数组 res
    # 初始化数组 res 用于记录结果
    n = len(nums)
    res = [0] * n
    for i in range(n - 1, -1, -1):
        num = nums[i]
        res[counter[num] - 1] = num  # 将 num 放置到对应索引处
        counter[num] -= 1  # 令前缀和自减 1 ,得到下次放置 num 的索引
    # 使用结果数组 res 覆盖原数组 nums
    for i in range(n):
        nums[i] = res[i]

计数排序只适用于非负整数。若想将其用于其他类型的数据,需要确保这些数据可以转换为非负整数,并且在转换过程中不能改变各个元素之间的相对大小关系。例如,对于包含负数的整数数组,可以先给所有数字加上一个常数,将全部数字转化为正数,排序完成后再转换回去。

在这里插入图片描述


http://www.kler.cn/news/361690.html

相关文章:

  • 间充质干细胞疗法迎来快速发展:国内新药申请超93项,全球临床试验超1300项
  • Docker基础部署
  • 某ai gpt的bug
  • element-时间选择器单独写两个时间选择器并按照规则进行置灰选择,精确到时分秒
  • 使用SpringBoot自定义注解+AOP+redisson锁来实现防接口幂等性重复提交
  • DolphinDB 2024 年度峰会回顾之分论坛:权益类数字基建与技术创新
  • 在软件开发中低耦合和高内聚是什么,如何实现,请看文章
  • 3194. 最小元素和最大元素的最小平均值 简单
  • CEEMDAN +组合预测模型(Transformer - BiLSTM + ARIMA)
  • React核心技术解析:以“智能购物助手”洞悉奥秘
  • Unity/C#使用EPPlus读取和写入Excel
  • 如何开启华为交换机 http
  • 【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO
  • 023_net基于ASP.NET的图书借阅系统的设计与实现2024_281bfi3e
  • C# WinForms 仿Toast弹出实现
  • Premiere与EDIUS区别于相同点
  • Spring的底层原理
  • Linux:Linux中第一个小程序_进度条
  • Springboot 使用EasyExcel导出Excel文件
  • 英语写作中“有前景的”promising的用法
  • Python 第七节 魔法圆阵
  • PCL 最小点数约束的体素滤波(永久免费版)
  • 利用DeepFlow解决APISIX故障诊断中的方向偏差问题
  • 2024 “源鲁杯“ Round[1] web部分
  • 无线网卡知识的学习-- mac80211主要代码流程
  • Eclipse 软件:配置 JDBC、连接 MySQL 数据库、导入 jar 包