基数排序python

2023-11-08

           一、基数排序介绍

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序。

多关键字排序:

       加入现在一个员工表,要求按照工资排序,年龄相同的员工按照年龄排序。

解决方法:

       先按照年龄进行排序,再按照工资进行排序

    二、基数排序的实例过程

举例:如对32,13,94,52,17,54,93排序,是否可以看作多关键字排序?

       可以,十位看作是第一关键字,个位看作是第二关键字。

排序过程:

第一步:按照个位分桶

按照个位数分好桶如下图:

 

第二步:从前往后依次输出:

第三步:按照十位数分桶

 第四步:出桶

 三、基数排序的Python代码实现

def radix_sort(li):
    """基数排序,装桶输出不做排序"""
    max_num=max(li)#最大值99->2,888->3,10000->5
    it=0
    #循环条件:如果10的it次方小于等于max_num
    while 10 ** it <=max_num:
        buckets=[[] for _ in range(10)] #生成10个桶
        for var in li:
            """
            取数字个位数的值:987%10 取余
            取数字十位数的值:(987//10)%10 取整再取余
            取数字百位数的值:(987//100)%10 对100取整再取余
            """
            digit=(var//10**it)%10
            buckets[digit].append(var)#分桶

        #分桶完成,将数据依次取出
        li.clear()
        for buc in buckets:
            li.extend(buc)  #将数据重新写回li

        it +=1


import random
li=list(range(100))
random.shuffle(li)
print(li)
radix_sort(li)
print(li)

运行结果:

[47, 51, 78, 93, 71, 70, 97, 73, 22, 30, 6, 87, 46, 86, 41, 54, 96, 57, 76, 60, 1, 20, 33, 81, 7, 0, 2, 42, 4, 32, 75, 69, 48, 13, 26, 63, 37, 25, 66, 80, 31, 67, 16, 82, 85, 88, 94, 50, 8, 98, 72, 89, 11, 56, 74, 65, 12, 52, 9, 36, 91, 23, 45, 84, 5, 34, 55, 95, 68, 24, 79, 44, 99, 3, 83, 35, 10, 59, 53, 62, 14, 49, 21, 15, 58, 38, 39, 92, 40, 77, 27, 43, 29, 18, 90, 64, 17, 61, 28, 19]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

Process finished with exit code 0

四、基数排序的算法性能

时间复杂度:O(kn),这里的k = log10n,而快速排序是O(nlog2n)。由此可见基数排序比快排要快。但是当数字范围越来越大,k越来越大时,效率会慢于快排。

  空间复杂度:O(k+n),基数排序空间上会消耗一个桶,空间消耗也是比较大的。因此最常用的还是快速排序和python自带的排序。

'''分析函数的写法'''
def list_to_buckets(li,base,iteration):
      """
        列表到桶
        :param li:
        :param base: 分的桶的个数
        :param iteration: 装桶是第几次迭代
        :return:
      """
      buckets = [[] for _ in range(base)]
      for number in li:
          digit = (number//(base ** iteration))%base
          buckets[digit].append(number)
      return buckets


def buckets_to_list(buckets):
    return [x for bucket in buckets for x in bucket]
    '''取到二维数组中的某个值'''
    # li = []
    # for bucket in buckets:
    #     for num in bucket:
    #         li.append(num)


def radix_sort(li,base=10):
    maxval=max(li)
    it=0
    while base **it <=maxval:
        li=buckets_to_list(list_to_buckets(li,base,it))
        it+=1
    return it


import random
li=[random.randint(0,100) for _ in range(10)]
random.shuffle(li)
s=radix_sort(li)
print(s)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基数排序python 的相关文章

  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 从文本文件中删除特定字符

    我对 Python 和编码都很陌生 我当时正在做一个小项目 但遇到了一个问题 44 1 6 23 2 7 49 2 3 53 2 1 68 1 6 71 2 7 我只需要从每行中删除第三个和第六个字符 或者更具体地说 从整个文件中删除 字符
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 反编译Python 3.9.2的PYC文件[重复]

    这个问题在这里已经有答案了 目前 我有一个 3 9 2 版本的 python 的 PYC 文件 P S 这适用于所有 3 9 及更高版本 我正在尝试反编译 PYC 文件 但它显示错误 因为 uncompyle6 或者更确切地说 新版本 de
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 使用 Paramiko 进行 DSA 密钥转发?

    我正在使用 Paramiko 在远程服务器上执行 bash 脚本 在其中一些脚本中 存在与其他服务器的 ssh 连接 如果我只使用 bash 不使用 Python 我的 DSA 密钥将被第一个远程服务器上的 bash 脚本转发并使用 以连接
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • python中basestring和types.StringType之间的区别?

    有什么区别 isinstance foo types StringType and isinstance foo basestring 对于Python2 basestring是两者的基类str and unicode while type
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • 网页书签

    h1 Bookmarks h1 dl p p dt h3 h3 dt dl
  • 【数学建模笔记 29】数学建模的多元分析

    29 多元分析 定义 多元分析是多变量的统计分析方法 是数理统计中应用广泛的一个重要分支 判别分析 判别分析是一种分类方法 假定有 r r r 类判别对象 A 1
  • matlab里面sin函数是角度,matlab中的sin(函数)

    笔记 matlab中的sin 函数 sin Sine of an argument in radians Syntax Y sin X Description The sin function operates element wise o
  • 内存管理技术——离散分配方式

    上一篇讲到 采用固定分区的方式 会产生页内碎片等缺点 因此引入了动态分区方式 但动态分区又产生了外部碎片 导致内存的利用率也不理想 为了进一步提高内存的利用率 所以就产生了离散的分配方式 理论来源于实际问题 这很好的体现在计算机科学中 离散
  • Gateway中判断是否满足过滤条件的代码片段

    SpringBootTest class MybaisplusApplicationTests private String startWith base login base logout base sendVerificationCod
  • Digital Pre-Distortion (数字预失真)以及用途

    Digital Pre Distortion 数字预失真 以及用途 2014 04 04 10 09 29 分类 FPGA 标签 fpga 数字预失真 通信基础 wcdma 功率放大器 举报 字号 订阅 http blog 163 com
  • 主机浏览器访问 VMware中Centos7 中运行的nginx

    VMware中Centos7 中nginx启动之后 通过curl http localhot 能够正常访问 虚拟机外部浏览器访问 确访问不到 原因是端口没设置 执行firewall cmd zone public add port 80 t
  • 大小写转换 蓝桥杯

    问题描述 编写一个程序 输入一个字符串 长度不超过20 然后把这个字符串内的每一个字符进行大小写变换 即将大写字母变成小写 小写字母变成大写 然后把这个新的字符串输出 输入格式 输入一个字符串 而且这个字符串当中只包含英文字母 不包含其他类
  • 从头搭建Android源码编译环境(Ubuntu 18.04 / 20.04 / 22.04)

    在新安装的Ubuntu上 版本20 04LTS 完成搭建Android源码编译环境步骤如下 顺带说一句 当前用的比较多的Ubuntu是18 04和20 04 在实际项目中一直在用 可用性和稳定性都没问题 最新的Ubuntu22 04版本 系
  • javase 基本运算符和三大流程

    范围 2 字节 X 8 1 2 字节 X 8 1 1 主要区别是数据大小范围 1 byte 一个字节 128 127 2 short 两个字节 32768 32767 3 int 四个字节 2147483648 2147483647 4 l
  • UGUI图片跟随文本框长度改变位置

    这次要完成一个功能 需要钻石图标跟随数字的长度改变位置 之前使用了Layout Group排版 在数字改变的时候会出现一点小问题 这次使用锚点去进行跟随 设置文本框的属性 使其从右往左排版 并添加ContentSizeFitter组件 使其
  • 智慧图书馆:自助阅读,安全防盗

    RFID技术在智慧图书馆建设中具有重要作用 可为构建书香校园智慧阅读新生态提供强有力的保障 RFID技术可以用来识别 追踪和保护图书馆的所有资料 通过RFID系统可实现图书借还 上架 查找 馆藏盘点等功能 大大的改进管理方式 提高工作效率
  • “囚徒”李一男回归华为真相揭密

    作者 周遊 时间 2006 09 25 11 44 50 来源 中国计算机报 name google ads frame marginwidth 0 marginheight 0 src http pagead2 googlesyndica
  • 自然语言处理技术之词向量:GloVe单词表示的全局向量(glove.840B.300d、glove.6B)

    目录 一 词向量介绍 二 GloVe学习词向量的词嵌入模型 三 词向量入门 代码下载 四 训练 五 模型概述 六 可视化 七 发布历史 一 词向量介绍 自然语言处理 NLP 中的词向量是将文本中的词汇表示为数值向量的技术 词向量的主要作用是
  • 物理机服务器应该注意的事

    物理机服务器应该注意的事 1 选址 服务器是个非常重要的硬件产品 对机房的也是有一定的要求的 比如温度 安全性 噪音 电源稳定性等等问题都需要解决 但是不是每个人都会选择自己建立一个机房 毕竟各方面加起来的成本都太高 这个时候可以选择一个专
  • @SpringBootApplication 相当于 @Configuration、@EnableAutoConfiguration 、 @ComponentScan 三个的作用

    ComponentScan 如果不设置basePackage的话 默认会扫描包的所有类 所以最好还是写上basePackage 减少加载时间 默认扫描 class路径 比如这个注解在com wuhulala 下面 那么会扫描这个包下的所有类
  • pycharm安装opencv-python失败的手动解决办法

    解决方法 直接将opencv python文件下载到本地 把文件放到对应pycharm项目的Lib site packages路径下 在这里分享window系统的opencv python文件下载链接 链接 https pan baidu
  • ACC测试理论--google软件测试之道

    ACC测试理论 A Attribute 特质 在测试之前 需了解产品的特质是什么 即客户为何需要选择此产品的原因 Chrome的定位是快速 安全 稳定和优雅 特质所拥有的特点如下 简单 如果你不能几分钟内列举出来 说明你还没有足够理解你的产
  • CMake添加gcov代码覆盖测试支持

    CMake添加gcov代码覆盖测试支持 金庆的专栏 在根CMakeList txt中添加ENABLE GCOV选项 OPTION ENABLE GCOV Enable gcov debug Linux builds only OFF IF
  • 基数排序python

    一 基数排序介绍 基数排序 radix sort 属于 分配式排序 distribution sort 又称 桶子法 bucket sort 或bin sort 顾名思义 它是透过键值的部份资讯 将要排序的元素分配至某些 桶 中 藉以达到排