vlambda博客
学习文章列表

排序算法(6)——基数排序


基数排序

概念:

        通过元素的部分要素,将要排序的元素分配至某些“桶”中,以此达到排序的作用。比如为整数排序,依次用整数的个位、十位...来排序(LSD低位优先);或者高位到低位依次排序(MSD高位优先)。


算法步骤:

  • 首先初始化10个桶(固定的),桶下标为0-9。

  • 按LSD就是按个位数大小排好放入桶内,然后在此基础上排十位,以此类推,直到遍历完最高位次。

  • 每一次排完都要把桶内元素还原回原数组中。


图源:https://www.runoob.com/w3cnote/radix-sort.html


算法复杂度:

时间复杂度----平均: O(n*k)  |  最坏:O(n*k)  |  最好:O(n*k)

空间复杂度----O(n+k)(n为元素个数,k表示最大整数由几位数构成)

稳定性----稳定


实例:

def radix_sort(ls):    i = 0             # 记录当前正在排哪一位,最低位为1 max_num = max(ls) # 最大值 j = len(str(max_num)) # 记录最大值的位数 while i < j: bucket_list =[[] for q in range(10)] #初始化桶数组 for x in ls: bucket_list[int(x / (10**i)) % 10].append(x) # 找到位置放入桶数组 ls.clear() for x in bucket_list: # 放回原序列 for y in x: ls.append(y) i += 1 return ls
if __name__ == '__main__': list1 = [34, 231, 74, 5, 98, 34, 18, 88, 147, 51, 65, 75, 144, 89] sort_list = radix_sort(list1) print(sort_list)

以上第一次按个位排序放入桶中是:

[[], [231, 51], [], [], [34, 74, 34, 144], [5, 65, 75], [], [147], [98, 18, 88], [89]]

第二次按十位排序:

[[5], [18], [], [231, 34, 34], [144, 147], [51], [65], [74, 75], [88, 89], [98]]

第三次按百位排序:

[[5, 18, 34, 34, 51, 65, 74, 75, 88, 89, 98], [144, 147], [231], [], [], [], [], [], [], []]

最后还原回原列表就排好了:

[5, 18, 34, 34, 51, 65, 74, 75, 88, 89, 98, 144, 147, 231]



以上若描述有误,还请留言指出,谢谢!