Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】

yizhihongxing

Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】

什么是分配排序法

分配排序法是一种基于各种数据分布特性和信息量的统计推测方法,通过计数完成排序过程。分配排序法是不基于比较的排序方法,排序效率很高。

常见的分配排序法示例

  • 桶排序
  • 基数排序

下面将对这两种排序进行详细说明。

桶排序

桶排序的思想是把数据分到有限数量的桶里。每个桶再分别进行排序。也就是说,假设输入数据服从均匀分布,将数据平均分配到 k 个桶中,每个桶再分别排序。

具体实现过程:

  1. 设置一个定量的数组当作空桶;
  2. 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  3. 对每个不是空的桶进行排序;
  4. 从不是空的桶里把排好序的数据拼接起来。

下面是Python代码:

def bucket_sort(arr, bucketSize=5):
    if len(arr) == 0:
        return arr

    minValue = arr[0]
    maxValue = arr[0]
    for i in range(1, len(arr)):
        if arr[i] < minValue:
            minValue = arr[i]
        elif arr[i] > maxValue:
            maxValue = arr[i]

    # 根据最大值与最小值计算桶的数量
    bucketCount = int((maxValue - minValue) / bucketSize) + 1
    buckets = []
    for i in range(bucketCount):
        buckets.append([])

    # 将数据放到桶中
    for i in range(len(arr)):
        buckets[int((arr[i] - minValue) / bucketSize)].append(arr[i])

    arr = []
    for i in range(len(buckets)):
        quick_sort(buckets[i])
        for j in range(len(buckets[i])):
            arr.append(buckets[i][j])

    return arr

基数排序

基数排序是按照数字的低位先排序,然后由低位次高位,依次排序到最高位。因此,基数排序方法适用于对较长的数列进行排序。

具体实现过程:

  1. 取得数组中的最大数,并取得位数;
  2. arr为原始数组,从最低位开始取每个位组成radix数组;
  3. 对radix进行计数排序(利用桶排序或计数排序都可以);

下面是Python代码:

def radix_sort(arr):
    radix, digit = 10, 1
    max_num = max(arr)

    while max_num >= digit:
        bucket_list = [[] for _ in range(radix)]
        for i in arr:
            bucket_list[int((i/digit)%10)].append(i)

        arr.clear()
        for i in bucket_list:
            arr += i

        digit *= radix

    return arr

示例说明

示例1:桶排序

对于输入数组[3, 1, 5, 2, 7, 6, 4, 8, 9, 10],使用桶排序得到的输出为:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

示例2:基数排序

对于输入数组[753, 758, 12, 15, 32, 36, 369],使用基数排序得到的输出为:

[12, 15, 32, 36, 369, 753, 758]

总结

分配排序法虽然不基于比较,但排序效率极高,特别适用于数据分布比较均匀的情况。桶排序和基数排序是其中两个比较常用的算法,掌握了这两个算法,可以对常见的数据排序问题快速得到解决。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • python中使用urllib2获取http请求状态码的代码例子

    下面是python中使用urllib2获取http请求状态码的完整攻略。 1. urllib2介绍 urllib2是Python自带的一个HTTP客户端库,可以用来向Web服务器发送HTTP请求并获取响应。它提供了一个模块化的操作方式,大大简化了HTTP协议编写过程,适用于爬虫、Web开发等多个领域。 2. urllib2使用方法 使用urllib2的一般步…

    python 2023年6月3日
    00
  • Python OpenCV实现图片预处理的方法详解

    Python OpenCV实现图片预处理的方法详解 介绍 在进行机器视觉相关任务时,我们经常需要进行图片预处理,以得到更好的视觉效果或者更好的算法结果。Python OpenCV是一个非常流行的图像处理库,其中包含了丰富的图像处理工具,可用于加速并简化图像预处理的过程。 本文将详细讲解如何通过Python OpenCV实现图片预处理的方法,包括调整大小、裁剪…

    python 2023年5月18日
    00
  • Python获取航线信息并且制作成图的讲解

    要获取航线信息并制作成图,需要使用Python中的一些库和工具。本文将详细讲解如何使用Python获取航线信息并制作成图的过程。 步骤1:获取航线信息 要获取航线信息,可以使用Python中的requests库和BeautifulSoup库。以下是一个获取航线信息的示例: import requests from bs4 import BeautifulSo…

    python 2023年5月15日
    00
  • python数据XPath使用案例详解

    Python数据XPath使用案例详解 什么是XPath XPath是一种在XML文档中选择节点的语言,它也可以用来在HTML文档中进行选择。 在Python中,我们可以使用XPath来获取HTML文档中的节点信息,然后使用这些信息进行数据分析和挖掘。 XPath由路径表达式组成,它以/分隔的路径表示不同层次的节点,具有极高的灵活性。 如何使用XPath 安…

    python 2023年6月3日
    00
  • 简单的Python抓taobao图片爬虫

    针对“简单的Python抓taobao图片爬虫”这一主题,我为您提供完整的攻略: 爬虫准备 安装requests和beautifulsoup4 首先,在Python环境中需要安装requests和beautifulsoup4两个库,以便我们使用其中的类和方法。在命令行输入以下命令即可: pip install requests pip install bea…

    python 2023年5月14日
    00
  • 在python中利用dict转json按输入顺序输出内容方式

    在Python中,我们可以使用dict将数据格式转换成JSON格式,方便在不同的系统之间进行数据传输。 默认情况下,Python中的dict对象转换成JSON格式后,输出的顺序是无序的。但是有些情况下,我们需要按照指定的顺序输出JSON内容,这时可以使用collections.OrderedDict和json.dumps中的sort_keys参数。 具体操作…

    python 2023年5月13日
    00
  • Python轻松搞定视频剪辑重复性工作问题

    下面是“Python轻松搞定视频剪辑重复性工作问题”的完整攻略。 前言 在进行视频剪辑时,某些重复性工作,如将多个视频合并为一个、对多个视频添加相同的片头片尾等,需要不断重复执行相同的操作,这一过程极为繁琐且容易出错,因此我们可以考虑使用Python脚本来自动化这些重复性工作以提高效率。 环境准备 在使用Python进行视频剪辑自动化前,需要准备以下环境: …

    python 2023年6月13日
    00
  • 详解python中各种文件打开模式

    下面是详解Python中各种文件打开模式的完整攻略。 1.文件打开模式 1.1 常见的文件打开模式 模式 描述 r 以只读方式打开文件,文件指针将会放在文件的开头 w 以只写方式打开文件,如果文件已经存在则打开之后先清空内容 x 以独占方式打开文件,如果文件已经存在则无法打开 a 以附加模式打开文件,如果文件已经存在则将数据附加到文件末尾 b 以二进制模式打…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部