原理
基数排序是一种非比较性的排序算法,它的基本思想是根据元素的位数,将元素分配到桶中,再将桶中的元素按顺序收集起来,从而实现排序的目的。
基数排序的原理如下:
- 将所有待排序的整数统一表示为同样位数的数字,不足位数的高位补0。
- 从最低位开始,按照该位上的数字,将元素分配到相应的桶中。
- 将桶中的元素按顺序收集起来,再将其放回原数组中。
- 重复步骤2-3,直到所有位都按照从低到高的顺序被处理完毕。
- 排序完成,输出有序数组。
需要注意的是,基数排序要求元素能够被分解为整数位,且每个位上的数字都是有限的。如果待排序元素不能满足这些条件,则无法使用基数排序。
基数排序的时间复杂度为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))
目录