基数排序
- 前言
- 这就是整个排序算法的最后一篇了,再深入的后来提出的排序算法基本上是基于这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。