leetcode 164 基数排序 计数排序 桶排序

本文介绍了基数排序和桶排序两种线性时间复杂度的排序算法,详细阐述了它们的工作原理和应用场景。在基数排序中,通过逐位排序实现整体排序,桶排序则根据数据分布情况将元素分配到桶中再进行排序。同时,文章提到了排序稳定性以及在特定问题下如何优化桶排序的策略。
摘要由CSDN通过智能技术生成

今天正好做到这个排序题了,需要用到O(N)复杂度的桶排序或者基数排序,正好学习下这两种排序。在学习过程中,还遇到了排序稳定性这样的概念,也可小小总结一下。

解法一:基数排序,复杂度O(K(M+N))
此解法是把一个元素分成单位?比如生日可以分成年,月份和日期,然后对这三个按顺序排序。基数排序也是这样很妙的原理,每次对数字的一位进行排序,从个位到最高位,所有位排好就ok了。注意,由于高位优先级最高,所以高位的排序应该放在后面。此算法复杂度为O(K(M+N)),其中K为关键字个数,M为关键字取值范围,即桶的个数。

class Solution:
    def maximumGap(self, nums: List[int]) -> int:
        if len(nums) < 2: return 0

        def get_digit(num, base):
            num = num % base
            return int(num / (base/10))

        base = 1

        while True:
            bucket = [[] for _ in range(10)]
            base *= 10

            # put            
            for num in nums:
                bucket[get_digit(num, base)].append(num)

            # collect
            tmp_nums = []
            for i in range(0, 10):
                tmp_nums.extend(bucket[i])

            # check
            ok = 1
            for i in range(len
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值