首页 > 其他分享 >基数排序 LSD py

基数排序 LSD py

时间:2024-04-27 12:44:05浏览次数:15  
标签:10 LSD 14 arr py digit 基数排序 265 213

链接:https://www.nowcoder.com/questionTerminal/1e68ccb2cbc74c3d9e0dea0c568789b8
设数组S[]={154,265,146,31,213,14,157,189,91,10,111,123},采用最低位优先(LSD)基数排序将S排列成升序序列,第1趟分配收集后元素14之前,之后紧邻的元素是()
第1趟分配收集后的结果为:10,31,91,111,213,123,154,14,265,146,157,189

基数排序可以排序整数、字符。原理是补齐长度,按位比较,按照比较方向可以分为低位优先(Least Significant Digit first, LSD)和高位优先 (MSD)。

平均时间复杂度:O(n*k),k是最大位数

原理

这里以比较整形数字为例:

  1. 确定最大数的位数:首先找出待排序数中的最大数,以确定最大位数。
  2. 初始化桶:创建10个桶(0-9),每个桶用于存放对应位数的数字。
  3. 分配数字到桶:从 最低位/最高位 开始,遍历每个数字,根据当前位的数值将其放入相应的桶中。
  4. 收集桶中数字:按顺序收集桶中的数字,放回原数组。
  5. 重复过程:对每一位重复上述分配和收集过程,直到 最高位/最低位。

低位优先

def radix_sort(arr):
    # 找出最大数以确定最大位数
    max_num = max(arr)
    # 计算最大数的位数
    max_digits = len(str(max_num))

    # 初始化桶
    buckets = [[] for _ in range(10)]

    # 从最低位开始,对每一位进行排序
    for digit in range(max_digits):
        # 分配数字到桶
        for num in arr:
            # 计算当前位的数值
            current_digit = (num // (10 ** digit)) % 10
            # 将数字放入相应的桶中,相同数字放在同一个桶,列表可以保证顺序
            buckets[current_digit].append(num)

        # 收集桶中的数字,放回原数组
        # arr = [num for bucket in buckets for num in bucket] #  不好理解
        arr.clear()
        for bucket in buckets:
            arr.extend(bucket)

        # 清空桶,为下一次分配做准备
        buckets = [[] for _ in range(10)]
        print(f"DEBUG digit: {digit}, arr: {arr}")

    return arr

# 测试数组
arr = [154, 265, 146, 31, 213, 14, 157, 189, 91, 10, 111, 123]
# 执行基数排序
sorted_arr = radix_sort(arr)
# 打印排序后的数组
print(sorted_arr)
DEBUG digit: 0, arr: [10, 31, 91, 111, 213, 123, 154, 14, 265, 146, 157, 189]
DEBUG digit: 1, arr: [10, 111, 213, 14, 123, 31, 146, 154, 157, 265, 189, 91]
DEBUG digit: 2, arr: [10, 14, 31, 91, 111, 123, 146, 154, 157, 189, 213, 265]
[10, 14, 31, 91, 111, 123, 146, 154, 157, 189, 213, 265]

refer

图文总结」程序员必知必会的十大排序算法 bigsai 发起于 2020-11-28

标签:10,LSD,14,arr,py,digit,基数排序,265,213
From: https://www.cnblogs.com/guilinmifen/p/18161910

相关文章

  • pip成功安装gdal的whl文件后,PyCharm仍报错No module named ‘osgeo’
    在根据网上的教程,成功pipinstall对应的whl文件后,发现PyCharm仍然显示无法调用osgeo。出现这样的问题,首先关注自己使用的环境,例如我使用的环境是(见下图)但当我打算卸载gdal库后,发现gdal安装的环境地址和我使用的环境地址不同(如下图)啊,原来是安装gdal的环境地址搞错了,我自己使......
  • Pycharm
    如何换日间模式在PyCharm中切换日间模式(通常称为“亮色模式”或“白天模式”)与切换夜间模式(暗色模式)的步骤相似。以下是如何在PyCharm中进行此操作的步骤:导航到外观与行为设置:在设置或偏好设置的窗口中,找到并点击Editor->ColorScheme选择日间模式:在ColorScheme......
  • PyQGIS二次开发指南
    当你的数据处理使用的是Python语言,而你的导师又让你开发界面,那么PyQGIS二次开发指南是你必读的圣经。QGIS支持Python语言进行二次开发,你将学会如何使用QtDesigner进行界面设计、加载栅格数据、加载矢量数据、软件打包、安装包制作等。写在前面随着GIS应用在国内的逐渐增多,越来......
  • python简介,第一个Python程序
    Python:可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Andr......
  • 华为od python
    importsysrows=4cols=4matrix=[[0,1,1,1],[30,30,-1,40],[0,20,20,40],[10,-1,30,40]]offsets=((-1,0),(1,0),(0,-1),(0,1))classNode:def__init__(self,x,y):self.x=xself.y=yself.initial_energy=0......
  • 利用python将沪深300股票历史数据存储在sqlite3
    一、环境准备1、python3中自带了sqlite3参考https://www.runoob.com/sqlite/sqlite-tutorial.html2、在sqlite中建表CREATETABLE[stock]([id]NVARCHAR(48),[name]NVARCHAR(24), [code]NVARCHAR(24),[date]INTEGERNOTNULL,[open]REAL,[close]......
  • 实验三 软件测试—pycharm开发
    一、实验题目:软件测试二、实验目的1、熟悉开发环境下的自动化测试工具;2、利用自动化测试工具进行自动化单元测试。三、实验内容1、选择开发环境,IDEA或PYCHARM任选其一;2、基于所选择的开发环境实现对输入的n个整数进行排序的代码;3、对所编写代码设计测试用例;4、基于所选择的......
  • Mac 卸载 PyCharm 方法
    Mac系统下PyCharm没有一键卸载程序,也没有完全卸载的插件,若要彻底删除,除了在应用(Application)里删除PyCharm到垃圾桶外,还需要在终端(Terminal)执行删除相应的文件及文件夹。1卸载列表 1.1删除应用程序文件 1.2删除应用支持文件 1.3删除偏好设置数据 1.4删除缓存数据 1.5删除日志......
  • 【pytorch学习】之线性神经网络-softmax回归
    softmax回归回归可以用于预测多少的问题。比如预测房屋被售出价格,或者棒球队可能获得的胜场数,又或者患者住院的天数。事实上,我们也对分类问题感兴趣:不是问“多少”,而是问“哪一个”:某个电子邮件是否属于垃圾邮件文件夹?某个用户可能注册或不注册订阅服务?某个图像描绘的是驴、......
  • 【python】记录一次python发送json数据到go服务端,服务端解析失败问题
    【python】记录一次python发送json数据到go服务端,服务端解析失败问题背景:在做性能测试时,python把采集到的性能数据通过post回传到服务端,服务端用go实现,服务端是将接收的json通过json.Unmarshal反序列化为对应的结构体,但在实现时一直提示数据类型错误的问题问题代码python发送请......