基数排序(python)

10.基数排序

10.1 算法思想

基数排序是对桶排序的扩展。
第一类:最低位优先法,简称LSD法:先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列;
第二类:最高位优先法,简称MSD法:先从最高位开始排序,再逐个对各分组按次高位进行子排序,循环直到最低位。(位没有数的话,补0)
这里以LSD为例,由于待排序元素每一位上的数字的取值范围是0—9,因此每按照某一位,需要10个桶,这样每一位上相同的数字会分配到一个桶里。

10.2 算法过程

基数排序(python)_第1张图片
假设有一未排序数组:
3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
首先根据个位数的数值,在遍历数值时将它们分配至编号0到9的桶中:
0:50
1:
2: 2
3: 3
4: 44,4
5: 5,15
6:36,26,46
7:47,27
8:38,48
9:19,
第二步
接下来将这些桶中的数值重新串接起来,成为以下的数列:
50,2,3,44,4,5,15,36,26,46,47,27,38,48,19
接着再进行一次分配,这次是根据十位数来分配:
0:2,3,4,5
1:15,19
2:26,27
3:36,38
4:44,46,47,48
5:50,
6:
7:
8:
9:
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
2,3,4,5,15,19,26,27,36,38,44,46,47,48,50
这时候整个数列已经排序完毕。
如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。

10.3 python代码

def getbit(num,i):          # 获取元素第i位的数
    return (num % (i * 10) - (num % i)) // i
def getMax(numList):        # 获取数组中的最大值
    if len(numList) == 1:
        return numList[0]
    maxNum = numList[0]
    for i in range(len(numList)):
        if numList[i] > maxNum:
            maxNum = numList[i]
    return maxNum
def radixSort(numList):
    if len(numList) == 0 or len(numList) == 1:
        return numList
    maxNum = getMax(numList)
    bitCount = 0
    index = 1
    while maxNum // index:
        bitCount += 1
        index *= 10
    currentBit = 1 
    # 统计一下最大值的bitCount(有多少位),因为比较多少次,是有最大值的位数决定的
    while currentBit <= 10**(bitCount-1):          # 开始循环的进行每一个位的比较
        res = []
        buckets = [[] for i in range(10)]    # 桶排序
        for i in numList:
            currentBitNum = getbit(i,currentBit)
            buckets[currentBitNum].append(i)
        for i in range(10):
            for j in range(len(buckets[i])):
                res.append(buckets[i][j])
        numList = res
        currentBit *= 10
    return numList
numlist = [12,3,45,3543,214,1,4553]
print(radixSort(numlist))
# 输出结果为:[1, 3, 12, 45, 214, 3543, 4553]

你可能感兴趣的:(算法)