iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python之基数排序的实现
  • 784
分享到

python之基数排序的实现

2024-04-02 19:04:59 784人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

算法思想         插

算法思想

        插入\交换\选择\归并类的排序算法都需要通过比较关键字的大小来完成排序.因为存在两两比较所以这一类的排序方法在最好情况下能达到的复杂度是O(n*logn),如快速排序\堆排序\归并排序.在一般情况下和最坏情况下复杂度更是达到O(n**2).

        为了降低复杂度,就有牛人想出了分配收集排序方法,稍后分析它的时间复杂度能到达O(n),

而基数排序就是一种典型的搜集分配收集排序方法.基数排序时一种借助于多关键字排序的思想对单关键字排序的方法.其基本思想是通过对排序记录进行若干趟(有几个关键字就几趟)"分配"与"收集"来实现排序.

        如:

       1. 对整数排序,建立编号0-9(10进制的基数)10个桶,用于装对应位为编号的记录.先将待排序序列分配按'个位'数字分配到10各桶中,然后将桶按从小到大的顺序串接起来.

        2.将上一步的结果再按'十位''数字分配到10各桶中,然后将桶按从小到大的顺序串接起来.

        3. 将上一步的结果再按'百位''数字分配到10各桶中,然后将桶按从小到大的顺序串接起来.

        4.如果还有千位\万位.重复以上步骤,直到完成最高位的分配与收集,排序结束.

动图示例:(转自菜鸟教程:1.10 基数排序 | 菜鸟教程 (runoob.com))

 

算法实现

1.本实现借助队列的数据结构,所以先来定义一个队列


# Bradley N. Miller, David L. Ranum
# Introduction to Data Structures and AlGorithms in python
# Copyright 2005
# 
#queue.py
 
class Queue:
    def __init__(self):
        self.items = []
 
    def isEmpty(self):
        return self.items == []
 
    def enqueue(self, item):
        self.items.insert(0,item)
 
    def dequeue(self):
        return self.items.pop()
 
    def size(self):
        return len(self.items)

2.处理输入数据

将一个列表作为输入,将每一个记录处理为具有相同位数的字符串(用字符串类型时为了方便处理)


def inDataProcess(lis):
    max_lengh = max([len(lis[i]) for i in range(len(lis))])  # 查询记录中最长的字符串
    return [x.zfill(max_lengh) for x in lis]  # 将每一个记录都通过添加前导0的方式转化为一样的长度

3.基数排序主函数


def radixSort(seq:list):
    source_data = inDataProcess(seq)  # 输入处理
    res = []  # 用于保存结果列表
    big_queue = Queue()  # 用于转化的队列
    for ele in source_data:
        big_queue.enqueue(ele)
 
    for i in range(len(source_data[0])-1,-1,-1):
        buckets = []  # 用于保存每一趟的10各基数桶
        for num  in range(10):  # 建立10个基数桶
            bucket = Queue()
            buckets.append(bucket)
        # 在基数桶中插入数据
        while not big_queue.isEmpty():
            currentEle = big_queue.dequeue()  # 大队列中出队一个元素
            index = int(currentEle[i])  # 根据元素对应位上的值添加进对应的基数桶中
            buckets[index].enqueue(currentEle)
 
        # 把基数桶串联起来
        new_big_queue = Queue()
        for bucket in buckets:
            while not bucket.isEmpty():
                out = bucket.dequeue()
                new_big_queue.enqueue(out)
                # print(new_big_queue.size())
        # 修改big_queue
        big_queue = new_big_queue
    # 将大队列中的元素保存到结果列表中
    while not big_queue.isEmpty():
        res.append(big_queue.dequeue().lstrip('0'))  # 利用lstrip('0')去掉前导0
    return res

4.测试及结果


if __name__ == '__main__':
 
    lis = [20,101,39,431,58,600,8,4,999,634,157,199,208,138,389,691,400,932,856,843,401,923]
    lis = [str(i) for i in lis]
    print(radixSort(lis))
    ''' 结果>>>['4', '8', '20', '39', '58', '101', '138', '157', '199', '208', '389', '400', '401', '431', '600', '634', '691',
    '843', '856', '923', '932', '999']'''

算法分析

1)时间复杂度
对于n个记录(假设每个记录含d个关键字,每个关键字的取值范围为rd个值)进行链式基数排序时,每一趟分配的时间复杂度为O(n),每一趟收集的时间复杂度为O(rd),整个排序需进行d趟分配和收集,所以时间复杂度为O(d(n+rd))。
(2)空间复杂度
所需辅助空间为2rd个队列指针,另外由于需用链表做存储结构,则相对于其他以顺序结构存储记录的排序方法而言,还增加了n个指针域的空间,所以空间复杂度为O(n+rd)。

算法的特征

(1)是稳定排序。
(2)可用于链式结构,也可用于顺序结构。
(3)时间复杂度可以突破基于关键字比较一类方法的下界O(nlog2n),达到O(n)。
(4)基数排序使用条件有严格的要求:需要知道各级关键字的主次关系和各级关键字的取值范围。


ref: 

1.严蔚敏等<<数据结构C语言版(第二版)>>

2.Bradley N. Miller, David L. Ranum <<Introduction to Data Structures and Algorithms in Python>>

到此这篇关于python之基数排序的实现的文章就介绍到这了,更多相关python之基数排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python之基数排序的实现

本文链接: https://www.lsjlt.com/news/131119.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python之基数排序的实现
    算法思想         插...
    99+
    2024-04-02
  • Python实现基数排序
    #! /usr/bin/env python #coding=utf-8 #基于桶排序的基数排序 from random import randint def RadixSort(list,d): for k ...
    99+
    2023-01-31
    基数 Python
  • 基数排序python实现
    基数排序 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。...
    99+
    2023-01-31
    基数 python
  • Java桶排序之基数排序详解
    基数排序也是桶排序的一种,也是跟样本数据强相关的,且基数排序要求样本数据是非负的十进制数,如果有小数或者负数,那么代码将要大量重写!这就是不基于比较的排序的弊端。一般来说,我们认为基...
    99+
    2024-04-02
  • 计数排序与桶排序python实现
    计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 此时数组中已经记录好每个值的数量,自然也就是有序的了 ...
    99+
    2023-01-31
    python
  • python排序算法之选择排序怎么实现
    一、前言初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。虽然它们的效率相对于高级排序算法偏低,但是在了解初级排序算法之后,再去学习相对复杂的高级排序算法会容易许多。二、描述选择排序表示从无...
    99+
    2023-05-17
    Python
  • 使用Python实现基数排序算法原理的实例
    基数排序算法是桶排序算法的一种,是对基于相同位置的值,进行分组排序。可能这么说有点不好理解,可以看下面的基数排序算法原理实例。 基数排序算法原理实例 指定数组[121,432,564,23,1,45,788],将数组进行基数排序,...
    99+
    2024-01-22
    算法的概念
  • Java排序算法之计数排序如何实现
    这篇文章主要为大家展示了“Java排序算法之计数排序如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java排序算法之计数排序如何实现”这篇文章吧。计数排序是非比较的排序算法,用辅助数组对...
    99+
    2023-06-21
  • JAVA十大排序算法之基数排序详解
    目录基数排序代码实现时间复杂度算法稳定性基数排序 vs 桶排序 vs 计数排序总结基数排序 常见的数据元素一般是由若干位组成的,比如字符串由若干字符组成,整数由若干位0~9数字组成。...
    99+
    2024-04-02
  • Python之排序
    列表内置的排序方法sort():>>> name [('a', 5), ('c', 3), ('b', 4), ('e', 1), ('d', 2)] >>> name.sort() >>&g...
    99+
    2023-01-31
    Python
  • Java语言怎么实现基数排序
    这篇文章主要介绍Java语言怎么实现基数排序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!算法思想:依次按个位、十位...来排序,每一个pos都有分配过程和收集过程,array[i][0]记录第i行数据的个数。pac...
    99+
    2023-05-30
    java
  • 【Python排序搜索基本算法】之Dij
            Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的。OSPF动态路由协议就是用的Dijkstra算法。下面还以那个图的例...
    99+
    2023-01-31
    算法 Python Dij
  • Python3 基本排序算法之冒泡排序,
      基本排序算法按时间复杂度分类  O(n^2)  冒泡排序  插入排序  选择排序  Q(n log n)  分而治之  快速排序  归并排序  冒泡排序  相邻的两个元素对比,大的数后推,遍历整个列表一次后,将最大项以冒泡的方式排列i到...
    99+
    2023-01-31
    算法
  • Java排序算法之堆排序如何实现
    这篇文章主要介绍了Java排序算法之堆排序如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性︰1.父结点的键值总...
    99+
    2023-06-21
  • python排序算法之选择排序
    一、前言 相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序3种。虽然它们的效率相对于高级排序...
    99+
    2023-05-17
    python排序算法 python选择排序
  • Java排序算法之怎么实现快速排序的三数取中法
    这篇文章主要讲解了“Java排序算法之怎么实现快速排序的三数取中法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java排序算法之怎么实现快速排序的三数取中法”吧!基本步骤三数取中在快排的过...
    99+
    2023-06-25
  • python排序算法之希尔排序
    目录一、前言二、算法描述第一步:第二步:第三步:第四步:第五步:三、代码实现一、前言 相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初...
    99+
    2023-05-17
    python排序算法 python希尔排序
  • Python排序算法之冒泡排序
    目录1. 前言2. 冒泡排序算法2.1 摆擂台法2.2 相邻两个数字相比较3. 选择排序算法4. 插入排序5. 快速排序6. 总结1. 前言 所谓排序,就是把一个数据群体按个体数据的...
    99+
    2023-01-07
    怎么用python写出冒泡排序 python中的冒泡排序算法 python冒泡排序简单方法
  • Python排序算法之 选择排序
      一、选择排序(Selection sort)  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为:选择排序。  1、原...
    99+
    2023-06-02
  • python排序算法之归并排序
    目录一、前言二、算法描述三、代码实现总结一、前言 相关知识来自《python算法设计与分析》。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒...
    99+
    2023-05-17
    python排序算法 python归并排序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作