def radix_sort(li):
"""基数排序,装桶输出不做排序"""
#根据最大值确定循环的次数 最大数的位数是几就做几次循环 可以log取对数 log以10为底888的对数
max_num=max(li)#最大值99->2次,888->3次,10000->5次
it=0#迭代多少次
#循环条件:如果10的it次方小于等于max_num
while 10 ** it <=max_num:
"""
10的0次方 执行循环1次 最大值9 10的0次方
10的1次方 2次
10的2次方 3次
10的3次方 4次
"""
buckets=[[] for _ in range(10)] #生成10个桶
#对于每个元素放入桶 ,每个元素放哪个桶 ;
# it=0时候看的个位,it=1时候看的十位,it=2时候看的百位,
#987数字取8 , it=1 ,取个位%10, 987//10-->98, 98%10-->8; it=3 987//1000-->9,9%10=9
for var in li:
"""
取数字个位数的值:987%10 取余
取数字十位数的值:(987//10)%10 取整再取余
取数字百位数的值:(987//100)%10 对100取整再取余
"""
digit=(var//10**it)%10
buckets[digit].append(var)#分桶
#分桶完成,将数据依次取出
li.clear()
for buc in buckets:
li.extend(buc) #将数据重新写回li
it +=1
import random
li=list(range(100))
random.shuffle(li)
print(li)
radix_sort(li)
print(li)
'''分析函数的写法'''
def list_to_buckets(li,base,iteration):
"""
列表到桶
:param li:
:param base: 分的桶的个数
:param iteration: 装桶是第几次迭代
:return:
"""
buckets = [[] for _ in range(base)]
for number in li:
digit = (number//(base ** iteration))%base
buckets[digit].append(number)
return buckets
def buckets_to_list(buckets):
return [x for bucket in buckets for x in bucket]
'''取到二维数组中的某个值'''
# li = []
# for bucket in buckets:
# for num in bucket:
# li.append(num)
def radix_sort(li,base=10):
maxval=max(li)
it=0
while base **it <=maxval:
li=buckets_to_list(list_to_buckets(li,base,it))
it+=1
return it
import random
li=[random.randint(0,100) for _ in range(10)]
random.shuffle(li)
s=radix_sort(li)
print(s)
基数排序实现详细注释版python
最新推荐文章于 2024-11-04 21:51:40 发布