基数排序(桶排序)介绍:
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法
基数排序(Radix Sort)是桶排序的扩展
基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。
基数排序基本思想
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤
基数排序实例说明
将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序。
1)第一轮
根据个位数排序:[542, 53, 3, 14, 214, 748]
2)第二轮
在第一轮的基础上,按照加入元素的先后次序取出,再根据十位依次放入对应的位置。
得到的数组:[3, 14, 214, 542, 748, 53]
3)第三轮
在第二轮的基础上,按照加入元素的先后次序取出,根据百位依次放入对应的位置。
得到的数组:[3, 14, 53, 214, 542, 748]
基数排序代码实现
要求:将数组 {53, 3, 542, 748, 14, 214 } 使用基数排序, 进行升序排序
思路分析:前面的图文已经讲明确
代码实现:
import time
import random
arr = [0 for i in range(80000)]
for i in range(80000):
arr[i]=random.randint(0,80000)
#arr = [53,3,542,748,14,214]
def radixSort(arr):
maxn = arr[0]
for i in range(len(arr)):
if arr[i]>maxn:
maxn = arr[i]
maxlength = len(str(maxn))
#第一轮
#定义一个二维数组,代表十个桶
#为了防止数据溢出,每个桶的大小等于len(arr)
bucket = [[0 for col in range(len(arr))] for row in range(10)]
n = 1
for i in range(maxlength):
#bucket[0]记录每个桶的个数
count = [0 for num in range(10)]
for j in range(len(arr)):
#取出个位数
digit = int(arr[j]/n%10)
#放进桶中
bucket[digit][count[digit]] = arr[j]
count[digit]+=1
#按照桶顺序取出数据
index = 0
for k in range(len(bucket)):
if bucket[k]!=0:
#也就是这个桶里面存在数据
for l in range(count[k]):
arr[index]=bucket[k][l]
index+=1
#count置零
count = [0 for num in range(10)]
print("第%d轮:"%(i+1))
print(arr)
n*=10
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
radixSort(arr)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
运行结果