博客代码是博主想复习下排序算法然后手打的,已经过调试。若还有错误请指出!
一、基数排序
算法思想:
平均 最坏 最好 空间 稳定性 复杂性
O(dn) O(dn)) O(dn) o(dn) 稳定 较复杂
1、时间复杂度
count * length;其中 count 为数组元素最高位数,length为元素个数;所以时间复杂度:O(n * d)
2、空间复杂度
空间复杂度是使用了两个临时的数组:10 + length;所以空间复杂度:O(n)。
算法稳定性
在基数排序过程中,每次都是将当前位数上相同数值的元素统一“装桶”,并不需要交换位置。所以基数排序是稳定的算法。
Python代码
def max_bit(input_list):
'''
函数说明:求出数组中最大数的位数的函数
Parameters:
input_list - 待排序列表
Returns:
bits-num - 位数
'''
max_index = 0
for i in range(1,len(input_list)):
if input_list[i] > input_list[max_index]:
max_index = i
max = input_list[max_index] # 得到最大的数
bit = 0
while max:
max //= 10
bit += 1
return bit
def redix_sort(input_list):
the_max_bit = max_bit(input_list) # 得到数组中最大数的位数的函数
for i in range(the_max_bit): # 排序轮数等于数组中最大数的位数
ten_buckets = [ [] for i in range(10) ] # 因为每一位数字都是0~9,故建立10个桶
for num in input_list:
bucket_num = int(num / 10**i % 10) # 如去百位上的数,即第三轮排序,此时i=2,如数字int(520 / 10**2 % 10) = 5
ten_buckets[bucket_num].append(num) # 将数字装进对应编号的桶
input_list = [num for bucket in ten_buckets for num in bucket ] # 按桶顺序取出
return input_list