基数排序(radixsort)迭代和递归

原理

基数排序是一种非比较性的排序算法,它的基本思想是根据元素的位数,将元素分配到桶中,再将桶中的元素按顺序收集起来,从而实现排序的目的。

基数排序的原理如下:

  1. 将所有待排序的整数统一表示为同样位数的数字,不足位数的高位补0。
  2. 从最低位开始,按照该位上的数字,将元素分配到相应的桶中。
  3. 将桶中的元素按顺序收集起来,再将其放回原数组中。
  4. 重复步骤2-3,直到所有位都按照从低到高的顺序被处理完毕。
  5. 排序完成,输出有序数组。

需要注意的是,基数排序要求元素能够被分解为整数位,且每个位上的数字都是有限的。如果待排序元素不能满足这些条件,则无法使用基数排序。

基数排序的时间复杂度为O(dn),其中d表示最大的数的位数,n表示待排序元素的个数,空间复杂度为O(n+k),其中k表示桶的个数,是一种较快的排序算法,但是对于极端情况下的数据,其效率可能会比较低。

基数排序示例:

#假设我们要对下面这组数进行排序:
170, 45, 75, 90, 802, 24, 2, 66

#首先,我们需要将它们统一表示为同样位数的数字,不足位数的高位补0。在这个例子中,最大的数是802,共有3位,因此我们需要将所有的数字都补齐至3位,如下:
170, 045, 075, 090, 802, 024, 002, 066

#接下来,我们从最低位开始,按照该位上的数字,将元素分配到相应的桶中。具体地说,我们需要创建10个桶,每个桶都用来存放该位上的数字相同的元素。对于每个元素,我们首先找到它的个位数字,然后将它放入对应的桶中。

#第一轮排序后,所有元素按照个位数字的大小被分配到了相应的桶中。桶中的元素按照它们原来的顺序被放回数组中。
170, 090, 802, 002, 024, 045, 075, 066

#接下来,我们再按照十位数字进行分配。对于每个元素,我们找到它的十位数字,然后将它放入对应的桶中。
#第二轮排序后,所有元素按照十位数字的大小被分配到了相应的桶中。桶中的元素按照它们原来的顺序被放回数组中。
002, 024, 045, 066, 075, 090, 170, 802

#最后,我们再按照百位数字进行分配。对于每个元素,我们找到它的百位数字,然后将它放入对应的桶中。
#第三轮排序后,所有元素按照百位数字的大小被分配到了相应的桶中。桶中的元素按照它们原来的顺序被放回数组中。
002, 024, 045, 066, 075, 090, 170, 802


迭代代码示例:

import random
def radix_sort(show_list):
    max_num = max(show_list)#找出列表中的最大值
    place = 1
    while max_num >= 10 ** place:#找出最大值的位置
        place += 1
    for i in range(place):
        buckets = [[] for _ in range(10)]#建立列表中的空列表
        for num in show_list:
            radix = int(num / (10 ** i) % 10)
            buckets[radix].append(num)#将num放入buckets中
        j = 0
        for k in range(10):
            for num in buckets[k]:
                show_list[j] = num
                j += 1
                print(show_list)
    return show_list


if __name__ == '__main__':
    show_list = [random.randint(0,1000)for i in range(10)]
    print(show_list)
    print(radix_sort(show_list))

递归代码示例:

import random
def radix_sort(array):
    max_num = max(array)
    place = 1
    while max_num >= 10 ** place:
        place += 1
    return place
def radix_sort2(array,i):
    # for i in range(place):
    m=radix_sort(array)
    if i<m:
        buckets = [[] for _ in range(10)]
        for num in array:
            radix = int(num / (10 ** i) % 10)
            buckets[radix].append(num)
        j = 0
        for k in range(10):
            for num in buckets[k]:
                array[j] = num
                j += 1
                print(array)
        radix_sort2(array, i+1)
    return array


if __name__ == '__main__':
    array = [random.randint(0,1000)for i in range(10)]
    print(array)
    radix_sort2(array,0)
    print(radix_sort2(array,0))

目录

原理

基数排序示例:

迭代代码示例:

递归代码示例:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值