数据结构-排序-基数排序法

基数排序法

基数排序法和我们之前所讨论的排序法不太一样,它并不需要进行元素间的比较操作,而是属于一种分配模式排序方式

基数排序法按比较的方向可以分为最高位优先(Most Significant Digit First,MSD)和最低位优先(Least Signigicat Digit First,LSD)两种。MSD法是从最左边的位数开始比较,而LSD则是从最右边的位数开始比较。以LSD为例对三位数的整数进行排序

原始数据

原始数据
5995734601681712593724588133
  1. 把每个整数按其个位数字放到列表中

    数字0123456789
    数据601713721333495
    45
    7168
    88
    59
    259

    合并之后为

    原始数据
    6017137213334954571688859259
  2. 再按十位数

    数字0123456789
    数据7133
    34
    4559
    259
    60
    168
    171
    372
    8895

    合并之后为

    原始数据
    7133344559259601681713728895
  3. 再按其百位数字

    数字0123456789
    数据7
    34
    45
    59
    60
    88
    95
    133
    168
    171
    259372

    合并之后为

    原始数据
    7344559608895133168171259372

基数排序法的分析

  • 在所有情况下,时间复杂度均为O(nlogpk),K是原始数据的最大值
  • 基数排序法是稳定排序法
  • 基数排序法会使用很大的额外空间来存放列表数据,其空间复杂度为O(n*p),n是原始数据的个数,p是数据字符数。
  • 若n很大,p固定或很小,则此排序很有效
import random


def radix(data,size):
    n = 1   #首先从各位开始
    while n <= 100:
        tmp = [[0] * 100 for row in range(10)]  #建立一个二维数组存储数据
        #存储临时数据
        for i in range(size):   #逐个查看数据
            m = (data[i] // n) % 10  #m为n位数的值,如36取十位数(36/10)%10=3
            tmp[m][i] = data[i]
        k = 0
        #取出临时数据
        for i in range(10):
            for j in range(size):
                if tmp[i][j] != 0:  #把不为零的数据取出来放到data中
                    data[k] = tmp[i][j]
                    k += 1
        print('经过%3d位数排序后:'%n,end='')
        showdata(data,size)
        n *= 10

def showdata(data,size):
    for i in range(1,size):
        print('%5d'%data[i],end='')
    print()

def inputarr(data,size):
    for i in range(size):
        data[i] = random.randint(0,999)

def main():
    data = [0] * 100
    size = int(input('请输入数组大小(100以下):'))
    print('您输入的原始数据:')
    inputarr(data,size)
    showdata(data,size)
    radix(data,size)

if __name__ == '__main__':
    main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值