微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python | 算法大神左神左程云算法课程 第三节

基数排序-python版

视频笔记戳这里

# 基数排序
# 针对非负数排序

class radixSort():
    def radixSortAll(self, arr):
        """
        对数组arr进行基数排序
        :param arr: List[int]
        :return: None
        """
        if len(arr) < 2:
            return
        self.radixSortLR(arr, 0, len(arr)-1, self.maxBits(arr))

    def maxBits(self, arr):
        """
        求数组arr的最大位数
        :param arr: List[int]
        :return: int
        """
        #最大位数记为max_bits
        max_bits = 0
        #寻找数组中的最大值max_num
        max_num = -1
        for i in range(len(arr)):
            max_num = max(arr[i], max_num)
        # 计算最大值的位数
        while max_num != 0:
            max_bits += 1
            max_num //= 10

        return max_bits

    def radixSortLR(self, arr, L, R, digit):
        """
        对数组arr的L~R位置进行基数排序,其中位数最大为digit
        :param arr:List[int]
        :param L:int
        :param R:int
        :param digit:int
        :return:None
        """
        #设置基数
        radix = 10
        #辅助空间数组
        help = [0]*(R-L+1)
        #从个位开始,一位一位排序
        for i in range(digit):
            #统计当前位的词频
            count = [0] * radix
            for j in range(R-L+1):
                cur_num = self.getDigit(arr[L+j], i+1)
                count[cur_num] += 1 #此处count[cur_num]的值表示数字cur_num出现的次数
            #统计好词频之后,将每个位置代表的次数向后累加
            j = 1
            while j < len(count):
                count[j] += count[j-1]  #此时count[j]表示小于等于j的数字出现的次数
                j += 1

            #从右向左拿出原数组的数按照当前位进行排序
            j = R
            while j >= L:
                current = self.getDigit(arr[j], i+1)
                help[count[current]-1] = arr[j]
                count[current] -= 1
                j -= 1
            #本轮排完序的数拷贝回原数组
            for j in range(len(help)):
                arr[L+j] = help[j]

    def getDigit(self, num, d):
        """
        获取数字num的第d位数字(从个位开始)
        :param num: int
        :param d: int
        :return: int
        """
        for i in range(d):
            res_num = num % 10
            num = num // 10

        return res_num

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐