【S-排序】python实现八大排序算法之10-基数排序(RadixSort)

2023-11-06

基数排序

基本思想:
- 基数排序(Radix Sort)是桶排序的扩展,将整数按位数切割成不同的数字,然后按每个位数分别进行了多轮的桶排序。具体实现:从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。
- 待排序的序列中的值必须是整数而且范围跨度不应太大,否则排序开销太大。例如可以用于学生成绩的排序,因为成绩的范围仅在100以内。

时间复杂度:
- 对于 n 个数值,执行一次分配和收集的时间为O(n)。如果关键字有 d 位,如果关键字有 d 位,则要执行 d 遍。 所以总的运算时间为 O(d*n)。可见不同的基数 r 所用时间是不同的。当 r 或 d 较小时,这种算法较为节省时间。上面讨论的是顺序表的基数排序,这个算法同样也是用与链式的记录排序,只是要求额外附加一下队列的头、尾指针。

基数排序时一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。按照关键字先后顺序,基数排序可以分为高位优先法和低位优先法。
一般来说低位优先法要比高位简单。因为高位优先是分治法思想,对子集按相同方法排序,是一个递归的过程。而低位优先法只要通过x次分配收集操作就可以完成排序,x是取决于关键字的多少

'''
Creat by HuangDandan
2018-08-19
dandanhuang@sjtu.edu.cn

基数排序
基本思想:将整数按位数切割成不同的数字,然后按每个位数分别比较。
步骤:
1-将整数按位数切割成不同的数字,然后按每个位数分别比较。从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。
2-等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。

编程实现注意点:
0-简单获取列表中最大数值的位数
1-如何按照位数将列表中的数值放入桶中
2-如何依次进行从个位数、十位数、百位数等的操作
将每次放入桶中的值拿出赋给原先的列表
'''

def RadixSort(Lst):
    d = len(str(max(Lst)))                                            #列表中的最大元素的位数
    for i in range(d):                                                #0-9一共10个桶
        BucketLst = [[] for k in range(10)]
        for j in range(len(Lst)):
            BucketLst[Lst[j]//(10**i)%10].append(Lst[j])              #10**i是关注意点,之前一直是10**d,debug才发现
        Lst = [number for B in BucketLst for number in B]             #关键2-依次拿出桶中的元素,给原列表Lst,
                                                                      # 而不是给缓存 temp = [number for B in BucketLst for number in B]

    return Lst


if __name__ == "__main__":
    Lst1 = [1,44,5,222,1]
    print(Lst1)

    print(RadixSort(Lst1))
    #print('------------------------------------')

温故知新:
我在编写程序的时候,没有传入序列中最大值的位数d,而是通过调用python里面内置的函数进行计算,d = len(str(max(Lst))) ,这样本身就会增加程序的时间复杂度。python内置函数求解max(Lst),需要对列表中的所有元素进行遍历,考虑时间复杂度,可以传入d参数~~

参考博客:
https://www.jb51.net/article/123676.htm
https://blog.csdn.net/will130/article/details/45196575
http://www.dwtmy.com/Aboutus.asp?title=%C1%AA%CF%B5%CE%D2%C3%C7
https://www.jianshu.com/p/8f8f19d7b2b9
https://www.cnblogs.com/surgewong/p/3381646.html

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

【S-排序】python实现八大排序算法之10-基数排序(RadixSort) 的相关文章

  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 在推送到容器注册表之前如何对构建的映像运行测试?

    从 gitlab 文档中可以看出如何使用 kaniko 创建 docker 镜像 build stage build image name gcr io kaniko project executor debug entrypoint sc
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • 绝对导入不起作用,但相对导入起作用

    这是我的应用程序结构 foodo setup py foodo init py foodo py models py foodo foodo foodo py从导入类models py module from foodo models im
  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • 当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

    我编写了一个小的 python 脚本来解析 提取 PDF 中的信息 我在本地机器上测试了它 我有 python 2 6 2 和 pdftotext 版本 0 12 4 我正在尝试在我的虚拟主机服务器 dreamhost 上运行它 它有 py
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包

随机推荐

  • 如何将Python写的代码打包成.exe可执行文件

    有时候我们需要将自己写的代码打包成exe文件 给别人使用需要怎么办呢 以下将讲解Python代码如何打包成 exe文件 1 下载pyinstaller 因为Python中有很多三方包 我们想要这些三方包也包含在里面就需要一个工具 就是pyi
  • ATF(TF-A) RSS-AP接口威胁模型-安全检测与评估

    安全之安全 security 博客目录导读 ATF TF A 威胁模型汇总 目录 一 简介 二 评估目标 1 数据流程图 2 威胁评估 一 简介 本文档是通用TF A威胁模型的扩展 它考虑那些运行时安全子系统 Runtime Securit
  • 情感分类介绍及发展方向

    情感分类 定义 情感分析 对一段文本进行情感识别 分类 按细粒度分 文本级情感分类 判断文章的情感极性 句子级情感分类 判断句子的情感极性 方面级情感分类 判断方面的情感极性 这里的方面指的是表达感情的实体或者实体所属的种类 方面级情感分类
  • (IP地址的计算)判断两个IP是否归属于同一子网

    目录 前言 判断依据 附示例 问题 前言 今天在做题的时候做到了IP地址计算这一部分的题目 太久没有看过了 忘得都差不多了 所以就查阅了资料并做了如下笔记 帮助学习理解 同时把这道题的题目与网友分享的做法分享给大家 可以一起做一做 希望能帮
  • eclipse使用技巧:技巧汇总

    1 F3 转到定义 Alt 方向键 上下左右 Alt 后退 相当于vs里面的Ctrl 2 Alt 或Alt 相当于vs里面的Ctrl K p 3 Ctrl 或Ctrl 注释与反注释的时候要注意了 如果同时取消多行注释 选行要选全 4 ecl
  • error while loading shared libraries: librediscluster.so..: cannot open shared object file: No such

    很纳闷明明设置了环境变量 路径也对 可就是报找不到库 等仔细去看的时候 发现 librediscluster so 这个库多了两点 这种反人性操作真不知作者怎么想的 把librediscluster so 复制成librediscluste
  • 4G时代的语音回落

    原文地址 http ask zealer com post 211 很多小伙伴在享受国内逐步正在建成的4G网络之际可能并不知道 虽然移动通讯网络迈过了这么多年头 用手机打电话这种语音通话范畴之内的事情有单独所谓的传统 语音业务 而浏览网页
  • Devstack部署多节点Openstack(转)

    平台工具介绍 操作系统 Windows7 工具 VirtualBox 5 0 24 镜像 ubuntu 14 04 5 server amd64 iso 下载地址 ubuntu14 04 5 server版 DevStack版本 Mitak
  • 解析逻辑回归模型

    介绍 逻辑回归模型是业界运用最为广泛的模型 我们从下面几个方面讨论这个模型 1 在模型层面上 逻辑回归模型是被用来解决分类问题的 由于分类是一个非线性问题 所以建模的主要难点是如何将非线性问题转化为线性问题 主要从两方面入手 从分解问题的角
  • 如何在Pycharm中安装QT Designer+PyUIC

    如何在Pycharm中安装QT Designer PyUIC 一 安装QT 安装pyqt5 方法一 方法二 安装 pyqt5tools 方法一 方法二 二 指定Qt Designer和PyUIC 添加QtDesigner 添加PyUIC 最
  • 土木人职场受挫该如何破局?转行IT互联网貌似已成首选!

    大学毕业两年 一直在内耗 既不想继续做工程 又不知道出了工地 自己还能做什么 本人毕业于一类院校的建筑环境与能源应用工程专业 通俗的说就是土木工程 进施工单位是大部分土木人的归宿 本科毕业生很多选择去中铁 中建等国企或者央企 在外人看来 国
  • SVN/GIT源代码泄露

    造成SVN源代码漏洞的主要原因是管理员操作不规范 在使用SVN管理本地代码过程中 会自动生成一个名为 svn的隐藏文件夹 其中包含重要的源代码信息 但一些网站管理员在发布代码时 不愿意使用 导出 功能 而是直接复制代码文件夹到WEB服务器上
  • 二进制的概念及运算

    前言 有的朋友觉得写代码做开发应该就是专注于开发出功能 管这些二进制干嘛呢 尤其是做上层开发的朋友 但是当自己出去面试的时候就有可能会碰壁 或者是在看源码的时候就会懵 打个比方我们在看hashmap的源码的时候 并不是每个人都能马上算出这些
  • git使用cherry-pick操作失败,出现CHERRY-PCIKING解决方法

    如果你使用cherry pick出现以下情况 需要撤销这个操作 使用命令 git reset HEAD 1
  • Hive之快速入门

    一 什么是Hive Hive是建立在Hadoop上的数据仓库基础架构 它定义了简单的类SQL查询语句 称为HQL HQL语言也支持用户自定义SQL函数 通过MR任务来处理复杂的分析任务 Hive中包含SQL解析引擎 它会将SQL语句转换成M
  • SPSS多重响应分析案例

    SPSS多重响应分析案例 在市场调查问卷中 总会设计一部分多项选择题 对于多选题 一般采用频数分析 SPSS提供了专门的多选题频数分析统计分析功能 调查问卷 您拥有以下哪些品牌的贵宾卡 1 班尼路 2 真维斯 3 佐丹奴 4 堡师龙 5 苹
  • C# object介绍

    C object介绍 Object类是C 语言仲最原始 最重要得类 是所有类得 祖先 每个C 类都是它得子类 它实现了每个类都必须具有得基本方法 在 Object 类中提供了 4 个常用的方法 即 Equals GetHashCode Ge
  • $(MAKE) -C $(KERNELDIR) M= $(PWD) modules

    转载于 http blog chinaunix net xmlrpc php r blog article uid 29523795 id 4209690 在mini2440资料的LED驱动编程的编译makefile里面看到这样一句话 C是
  • 【华为OD机试 2023】士兵过河(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 【S-排序】python实现八大排序算法之10-基数排序(RadixSort)

    基数排序 基本思想 基数排序 Radix Sort 是桶排序的扩展 将整数按位数切割成不同的数字 然后按每个位数分别进行了多轮的桶排序 具体实现 从低位开始将待排序的数按照这一位的值放到相应的编号为0 9的桶中 等到低位排完得到一个子序列