算法刷题打卡第52天:排序数组---桶排序

news2024/11/21 2:27:21

排序数组

难度:中等

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

桶排序

思路:
假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序)。

为了使桶排序更加高效,我们需要做到这两点:

  1. 在额外空间充足的情况下,尽量增大桶的数量
  2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

什么时候最快: 当输入的数据可以均匀的分配到每一个桶中。
什么时候最慢: 当输入的数据被分配到了同一个桶中

样例如下:

在这里插入图片描述

在桶排序中保证元素均匀分布到各个桶尤为关键。举个反例,有数组 [0,9,4,5,8,7,6,3,2,1] 要排序,它们都是10以下的数,如果还按照上面的范围[0,10)建立桶,全部的元素将进入同一个桶中,此时桶排序就失去了意义。实际情况我们很可能事先就不知道输入数据是什么,为了保证元素均匀分不到各个桶中,需要建立多少个桶,每个桶的范围是多少呢?其实我们可以这样:简单点,首先限定桶的容量,再根据元素的个数来决定桶的个数。当然使用更复杂的方法也是可以的。

桶排序利用函数的映射关系,减少了几平所有的比较工作。实际上,桶排序的)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做先进的比较排序即可。

时间复杂度: O ( n + k ) O(n+k) O(n+k) n n n 为数字长度, k k k 为 “桶的个数”,这个仅为分桶的时间复杂度,还需要加上桶内排序的时间复杂度。
空间复杂度: O ( n + k ) O(n+k) O(n+k) n n n 为数字长度, k k k 为 “桶的个数”。

class Solution:
    # 冒泡排序优化版
    def bubbleSort(self, nums):
        length = len(nums)
        for i in range(length - 1):
            # 记录排序状态,如果进行某次冒泡操作没有需要更换位置的情况,则直接退出循环,排序完成
            isSorted = True 
            for j in range(length - 1 - i):
                if nums[j] > nums[j+1]:
                    nums[j], nums[j+1] = nums[j+1], nums[j]
                    isSorted = False
            if isSorted:
                break
        return nums

    # 桶排序
    def bucketSort(self, nums, bucketCup):
        # 初始化桶,每个桶的区间为bucketCup
        min_num, max_num = min(nums), max(nums)
        bucket_size = (max_num - min_num) // bucketCup
        bucket = [[] for i in range(bucket_size+1)]
        # 入桶
        for x in nums:
            bucket[(x - min_num) // bucketCup].append(x)
        # 桶内采用冒泡排序
        for i in range(len(bucket)):
            bucket[i] = self.bubbleSort(bucket[i])
        # 出桶返回排序结果
        return [j for i in bucket for j in i]

    def sortArray(self, nums: List[int]) -> List[int]:
        # 进行桶排序+冒泡排序,设定每个桶的间隔为10
        return self.bucketSort(nums, 10)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 CSDN 客服年终总结

hello,大家好,这里是《听用户心声,解用户之需》之 2022 年终总结篇。 秉承“用户至上”的服务理念,为了给用户提供极致的服务体验而时刻努力着,2022年,在大家的一致努力下,究竟有何成效呢&#…

SpringBoot1:helloword、导入依赖、配置项设置,打包方法、lombok、dev-tools、Spring Initailizr、常见注解

1.简介 简化Spring开发的一个框架。对整个Spring技术栈的大整合 J2EE企业级开发的一站式解决方案。 2.微服务 一个应用应该是一组小型服务,可以通过HTTP的方式来进行互通 每一个功能元素都是可独立替换,和独立升级的软件单元。 3.HelloWord 功能&am…

Stm32标准库函数5——OV2640 PA0-7 F103C8T6 4500000 联合VB 高分辨率

stm32f103c8t6串口发送 OV2640的图像,分辨率可选。网络上资料大部分是低分辨率的,这个可以做高分辨率 完整工程打包,包含VB串口显示界面: https://download.csdn.net/download/fengyuzhe13/87327054https://download.csdn.net/do…

【经典问题:HanoiTower(汉诺塔)】

🎁HanoiTower🎅HanoiTower问题描述🎅🎅模拟推导🎅🎅🎅问题的两种形式🎄求解移动总次数🎄🎄打印详细的移动过程🎅HanoiTower问题描述 汉诺塔问题&a…

基于HMM模型实现中文分词

任务描述:在理解中文文本的语义时需要进行分词处理,分词算法包括字符串匹配算法,基于统计的机器学习算法两大类。本案例在前文将说明常用分词库及其简单应用,之后会通过中文分词的例子介绍和实现一个基于统计的中文分词方法——HMM模型,该模型能很好地处理歧义和未登录词问…

[含文档+源码等]基于SSM实现的宿舍公共财产管理系统|寝室

博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室 演示视频 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室_哔哩哔哩_bilibili 系统介…

经济低迷形势下,如何降低软件开发成本?

1、选对开发方法 过程决定结果。方法错了,再有经验的人,结果也不会好。例如,软件开发方法从70年代的瀑布,一步步从迭代、快速原型等进化到现在的敏捷、规模化敏捷、DevOps等。统计数字显示,使用敏捷方法,平…

Excel中实现时间相减,得到间隔时间(年月日时分秒)

一、年月日之差 表中有开始日期和结束日期,我们在D3单元格中输入“C3-B3” 于是,得到下面的结果 很显然,结果并不是我们想要的。说明这种方法不行,为了得到两个日期之间的时间间隔,需要用到DATEDIF函数。先来说下DATED…

我国融资性担保行业整体呈减量提质趋势 国家“出手”解决行业痛点

根据观研报告网发布的《中国融资性担保行业发展趋势分析与投资前景预测报告(2022-2029年)》显示,融资性担保行业是指担保人与银行业金融机构等债权人约定,当被担保人不履行对债权人负有的融资性债务时,由担保人依法承担…

Go:使用 go-micro 构建微服务(一)

一、微服务 什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。 大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务…

语音识别芯片LD3320介绍再续

语音识别芯片LD3320驱动程序 1、芯片复位 复位就是对LD3320芯片的第47腿(RSTB*)发送低电平,然后需要对片选CS做一次拉低→拉 高的操作,以激活内部DSP。按照以下顺序: void LD_reset() { RSTB1;delay(1);RSTB0;delay…

TencentOS 3.1下安装zabbix 5.0.30

TencentOS是使用官方镜像文件安装的虚拟机。 虚拟机为virtualBox 6.1 zabbix 使用zabbix官方安装包编译安装。 下载地址: Download Zabbix sources zabbix软件包解包,本次安装解包在/opt下 zabbix需要nginx、php、mysql等软件支持,因此先安装它们。 安装mysql如下: yu…

Usaco Training刷怪旅 第二层第二题:Transformations

usaco training 关注我持续更新usaco training A square pattern of size N x N (1 < N < 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to t…

QCon直击|闲鱼推荐大规模应用背后的工程实践

讲师介绍闲鱼技术部 | 吴白万小勇&#xff08;吴白&#xff09;&#xff0c;闲鱼服务端专家。毕业于南京大学计算机系&#xff0c;目前负责闲鱼技术推荐架构。推荐在闲鱼的应用不同于搜索的确定性&#xff0c;推荐场景面临的问题往往是不确定的。但是正是因为这种不确定&#x…

Kafka无法对外暴露端口的相关解决方案

1、kafka开放外部访问 1.1、修改kafka configMap 修改内容如下 # 修改EXTERNAL_ACCESS_IP变量&#xff0c;值为真实的外网IP export EXTERNAL_ACCESS_IP${真实的外网IP} 1.2、重启kafka # 重启kafka kubectl rollout restart statefulset kafka -n default # 查看kafka状态 k…

盛邦安全将于12月27日上会,2022年前三季度收入1亿元

12月20日&#xff0c;上海证券交易所披露的科创板上市委2022年第112次审议会议公告显示&#xff0c;远江盛邦&#xff08;北京&#xff09;网络安全科技股份有限公司&#xff08;下称“盛邦安全”&#xff09;将于2022年12月27日上会。 目前&#xff0c;盛邦安全已经提交了招股…

在tushare量化平台可以获取哪些数据?

沪深股票数据是Tushare量化最传统、最具历史意义的数据服务项目从一开始就为投资者特别是定量投资者提供了稳定、方便的接口。 1.基础数据 提供交易和回测所需要的基础信息&#xff0c;目前主要提供的是上市公司股票列表和交易日历等 2.行情数据 行情数据目前还在继续规则和…

“史上最贵”卡塔尔世界杯,有哪些炫酷的“黑科技”?

2022年卡塔尔世界杯投入超过2200亿美元&#xff0c;堪称“史上最贵世界杯”。这些投入不仅用在了场馆、道路等基础设施建设中&#xff0c;也体现在让人震撼的芯片传感器、人工智能、先进技术等“黑科技”上。今年的卡塔尔世界杯有什么“科技感十足”的先进技术&#xff1f;让我…

坐标系相关整理

参考url:https://www.jianshu.com/p/06890af3d780 Dicom坐标系 x轴&#xff1a;从右手到左手 y轴&#xff1a;从前胸到后背 z轴&#xff1a;从脚到头 解刨学坐标系 医学人体三解剖面&#xff0c;医疗影像三维图&#xff0c;主要是针对人体来说。解剖学上的坐标体系&#xff0…

常见垃圾回收器

1.Serial垃圾回收器 Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器了&#xff0c;是一个单线程收集器 它只会使用一个垃圾收集线程去完成垃圾收集工作 它在进行垃圾收集工作的时候必须暂停其他所有的工作线程&#xff08; "Stop The Worl…