排序算法——基数排序

基数排序(桶排序)介绍:

基数排序(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()))




运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值