Python程序员面试算法宝典---解题总结: 第8章 排序 8.8 如何进行基数排序

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第8章 排序 8.8 如何进行基数排序

题目:

分析:
基数排序,实际上又称为桶排序。
举例如下:
假设数组为:
[24, 67, 32, 781, 256, 6, 379, 56]
第一趟: 按照个位排序,放入对应编号的桶中,结果如下
桶编号         数字
0
1               781
2               32
3
4               24
5
6               256,6,56
7               67
8
9               379
此时得到数组如下:
781,32,24,256,6,56,67,379
第二趟;
按照十位排序,如果该数没有十位,默认为0
结果如下:
桶编号         数字
0               6
1
2               24
3               32
4
5               256,56
6               67
7               379
8               781
9
此时得到数组如下:
6,24,32,256,56,67,379.781
最后对百位重复上述操作得到:
桶编号         数字
0               6,24,32,56,67
1
2               256
3               379
4
5
6
7
8               781
9
最终得到:
6,24,32,56,67,256,379,781

关键:
1 基数排序
第一趟选择个位,第二趟选择10位,...
每一趟将数字上该位对应的值放入到对应编号的桶中,
最后输出桶的结果即可。
时间复杂度:
线性O(N*Log(R)m),其中r所采取的基数,m为堆数
空间复杂度:
O(R),R为采取的基数
稳定性: 稳定的排序

参考:
Python程序员面试算法宝典
'''

'''
计算一个数的位数,可以让数不断除以10,
直到为0,
统计除以10的次数即为该数的位数。
但是如果出现负数怎么办,暂时不考虑
'''
def getDigit(num):
    if num < 0:
        return 0
    count = 0
    while num != 0:
        num /= 10
        count += 1
    return count

'''
获取一个数字第i位上的值,
例如:
第一位是个位,第二位是十位...


'''
def getDigitValue(num, digitNum):
    results = []
    for i in range(0, digitNum):
        value = num % 10
        num /= 10
        results.append(value)
    return results[-1]


def radisSort(array):
    if not array:
        return
    # 获取最大的数,并计算最大的数的位数
    maxValue = max(array)
    digitNum = getDigit(maxValue)
    # 建立桶
    for i in range(0, digitNum):
        hashMap = dict()
        for value in array:
            digitValue = getDigitValue(value, i + 1)
            if digitValue not in hashMap:
                hashMap[digitValue] = [value]
            else:
                hashMap[digitValue].append(value)
        # 获取一趟后的排序结果
        results = []
        for digitValue, arr in hashMap.iteritems():
            results.extend(arr)
        array = results
    return array


def process():
    array = [24, 67, 32, 781, 256, 6, 379, 56, 0]
    results = radisSort(array)
    print results


if __name__ == "__main__":
    process()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值