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

算法刷题打卡第49天:排序数组---计数排序

排序数组

难度:中等

给你一个整数数组 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]

计数排序

思路:
计数排序是一个排序是不比较元素大小的排序算法。

计数排序对一定范围内的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序,而且待排序元素值分布较连续跨度小的情况。

如果一个数组里所有元素都是整数,而且都在0-K以内。那对于数组里每个元素来说,如果能知道数组里有多少项小于或等于该元素,就能准确地给出该元素在排序后的数组的位置。

计数排序样例:

请添加图片描述

实际应用中我们会同时找出数组中的 maxmin ,主要是为了尽量节省空间。试想 [1003,1001,1030,1050] 这样的数据要排序,真的需要建立长度为1050+1 的数组吗?我们只需要长度为 1050-1003+1=48 的数组(先不考虑额外 +1 的长度),就能囊括从最小到最大元素之间的所有元素了。

如果待排序数组的元素值跨度很大,比如 [99999,1,2],为三个元素排序要使用 99999-1+1 的空间,实在是浪费。所以计数排序适用于待排序元素值分布较连续、跨度小的情况。

时间复杂度: O ( n + M ) O(n+M) O(n+M),其中 n n n 是数组长度, M M M m a x max max - m i n min min + 1。
空间复杂度: O ( M ) O(M) O(M) M M M m a x max max - m i n min min + 1。

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        nums_min, nums_max = min(nums), max(nums)
        # 构建计数数组
        nums_count = [0 for i in range(nums_max - nums_min + 1)]
        for i in nums:
            nums_count[i - nums_min] += 1
        # 通过计数数组转换完成排序
        index = 0
        for j, x in enumerate(nums_count):
            if x:
                nums[index: index+x] = [j + nums_min] * x
                index += x
        return nums

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sort-an-array

相关文章:

  • 【Linux】低级IO
  • 【Linux】shell命令以及运行原理
  • 【解决】Unity Player Log 自生成造成磁盘满占用率问题
  • 犀牛插件开发-基础核心-技术概览-总体架构-教程
  • 看2022年卡塔尔世界杯有感
  • 小黑被劝退了,生活学习依然继续的leetcode之旅:572. 另一棵树的子树
  • 数据库原理及MySQL应用 | 日志管理
  • web前端经典react面试题
  • web靶场搭建之帝国cms7.5
  • Spring Boot学习篇(一)
  • RosonQt140——Qt Charts模块介绍和Qt绘制图表
  • 正交编码器溢出处理
  • 机器学习——05线性回归
  • IIC信号为什么要加上拉电阻
  • Tippecanoe安装使用
  • [译]CSS 居中(Center)方法大合集
  • 【知识碎片】第三方登录弹窗效果
  • Django 博客开发教程 8 - 博客文章详情页
  • exif信息对照
  • Java,console输出实时的转向GUI textbox
  • JavaScript实现分页效果
  • js中的正则表达式入门
  • laravel 用artisan创建自己的模板
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL的数据类型
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python socket服务器端、客户端传送信息
  • React-flux杂记
  • vuex 学习笔记 01
  • Vue全家桶实现一个Web App
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 基于 Babel 的 npm 包最小化设置
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 使用SAX解析XML
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​低代码平台的核心价值与优势
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • !!java web学习笔记(一到五)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #QT(串口助手-界面)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)丶RabbitMQ的六大核心
  • (一一四)第九章编程练习
  • (转)c++ std::pair 与 std::make
  • (转)Linq学习笔记
  • (转)关于多人操作数据的处理策略
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET/C# 使窗口永不获得焦点
  • @property括号内属性讲解
  • @Valid和@NotNull字段校验使用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • []sim300 GPRS数据收发程序
  • [14]内置对象