基数排序法
基数排序法和我们之前所讨论的排序法不太一样,它并不需要进行元素间的比较操作,而是属于一种分配模式排序方式
基数排序法按比较的方向可以分为最高位优先(Most Significant Digit First,MSD)和最低位优先(Least Signigicat Digit First,LSD)两种。MSD法是从最左边的位数开始比较,而LSD则是从最右边的位数开始比较。以LSD为例对三位数的整数进行排序
原始数据
原始数据 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
59 | 95 | 7 | 34 | 60 | 168 | 171 | 259 | 372 | 45 | 88 | 133 |
-
把每个整数按其个位数字放到列表中
数字 0 1 2 3 4 5 6 7 8 9 数据 60 171 372 133 34 95
457 168
8859
259合并之后为
原始数据 60 171 372 133 34 95 45 7 168 88 59 259 -
再按十位数
数字 0 1 2 3 4 5 6 7 8 9 数据 7 133
3445 59
25960
168171
37288 95 合并之后为
原始数据 7 133 34 45 59 259 60 168 171 372 88 95 -
再按其百位数字
数字 0 1 2 3 4 5 6 7 8 9 数据 7
34
45
59
60
88
95133
168
171259 372 合并之后为
原始数据 7 34 45 59 60 88 95 133 168 171 259 372
基数排序法的分析
- 在所有情况下,时间复杂度均为O(nlogpk),K是原始数据的最大值
- 基数排序法是稳定排序法
- 基数排序法会使用很大的额外空间来存放列表数据,其空间复杂度为O(n*p),n是原始数据的个数,p是数据字符数。
- 若n很大,p固定或很小,则此排序很有效
import random
def radix(data,size):
n = 1 #首先从各位开始
while n <= 100:
tmp = [[0] * 100 for row in range(10)] #建立一个二维数组存储数据
#存储临时数据
for i in range(size): #逐个查看数据
m = (data[i] // n) % 10 #m为n位数的值,如36取十位数(36/10)%10=3
tmp[m][i] = data[i]
k = 0
#取出临时数据
for i in range(10):
for j in range(size):
if tmp[i][j] != 0: #把不为零的数据取出来放到data中
data[k] = tmp[i][j]
k += 1
print('经过%3d位数排序后:'%n,end='')
showdata(data,size)
n *= 10
def showdata(data,size):
for i in range(1,size):
print('%5d'%data[i],end='')
print()
def inputarr(data,size):
for i in range(size):
data[i] = random.randint(0,999)
def main():
data = [0] * 100
size = int(input('请输入数组大小(100以下):'))
print('您输入的原始数据:')
inputarr(data,size)
showdata(data,size)
radix(data,size)
if __name__ == '__main__':
main()