排序算法-08基数排序(python实现)

基数排序

  • 前言
    • 这就是整个排序算法的最后一篇了,再深入的后来提出的排序算法基本上是基于这8中基本的排序算法,不做过多赘述。
  • 概述
    • 这是完全不同于之前的排序理念的一种排序方式,它是非基于比较的整形数据排序算法。
    • 基本原理是将整数按照位数切割为不同的数字,然后按照位数比较。
    • 这种排序不一定只适合整数,有些数据格式有内含整数的可能性。
  • 算法思路
    • 把待比较的所有整数统一化为同样的数位长度,数位不足前面补0,然后从最低位开始,依次排序,显然,按照这个步骤,待排序到最后一位数据一定有序。
  • 算法评价

    • 复杂度分析

      排序名称 最好情况 最坏情况 平均情况
      基数排序 O(nlog2n) O(nlog2n) O(nlog2n)
    • 稳定性
      • 算法稳定。
# -*- coding:UTF-8 -*-
"""
本模块实现了一维整形数的基数排序
"""
def RadixSort(data=[1, 2, 3, 4, 5]):
    def getMaxBit(data):
        '''
        求出最大数的位数
        :param data:
        :return:
        '''
        maxData = max(data)
        bitsNum = 0
        while maxData:
            bitsNum += 1
            maxData //= 10
        return bitsNum


    def getDigit(number, n):
        '''
        取number第n位数字
        :param number:
        :param n:
        :return:
        '''
        p = 1
        while n > 1:
            n -= 1
            p *= 10
        return number // p % 10

    length = len(data)
    bucket = [0]*length
    for d in range(1, getMaxBit(data)+1):
        count = [0]*10
        for i in range(length):
            count[getDigit(data[i], d)] += 1
        for i in range(1, 10):
            count[i] += count[i-1]
        for i in range(0, length)[::-1]:
            k = getDigit(data[i], d)
            bucket[count[k] - 1] = data[i]
            count[k] -= 1
        for i in range(0, length):
            data[i] = bucket[i]
    print(data)
    return None


if __name__ == '__main__':
    testData = [50, 123, 456, 187, 4, 11, 100]
    RadixSort(testData)

具体可以查看我的github。 

猜你喜欢

转载自blog.csdn.net/zhouchen1998/article/details/85054668