# -*- 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()