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

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 中sys.getsizeof的用法说明

    当我们使用Python编写代码时,需要了解如何检查变量或对象所占的内存空间大小。 sys.getsizeof()是Python内置模块sys中的一个函数,用于获取Python对象的字节大小,包括对象自身使用的空间以及对象引用的其他对象的空间。 1. 函数用法说明 函数调用 import sys sys.getsizeof(object[, default])…

    python 2023年6月2日
    00
  • DataFrame 将某列数据转为数组的方法

    要将DataFrame中的某列数据转为数组,可以通过Pandas中的values属性来实现。具体步骤如下: 选择某列数据 在DataFrame中选择想要转为数组的列数据。可以通过列名来选择,例如选择列名为 “col_name” 的列: df[‘col_name’] 调用 values 属性 在选中列后,可以调用values属性将其转为数组: df[‘col_…

    python 2023年6月5日
    00
  • 基于Python实现对PDF文件的OCR识别

    我将为你详细讲解“基于Python实现对PDF文件的OCR识别”的完整攻略。 简介 OCR(Optical Character Recognition)即光学字符识别,是指将图像中的文字、数字等字符转换成可以被计算机识别的编码格式的过程。在实际应用中,PDF文件曾经难以被OCR识别,但随着技术的发展,现在很多开源的OCR工具支持对PDF文件的识别了。 本篇攻…

    python 2023年5月18日
    00
  • python内置函数sorted()用法深入分析

    Python内置函数sorted()用法深入分析 Python内置函数sorted()用于对可迭代对象进行排序,返回一个新的已排序的列表。在本篇攻略中,我们将深入分析sorted()函数的用法,并提供两个示例说明。 基本用法 sorted()函数的基本用法如下: sorted(iterable, key=None, reverse=False) 其中,ite…

    python 2023年5月13日
    00
  • python 解析html之BeautifulSoup

    Python解析HTML之BeautifulSoup 在本文中,我们将介绍如何使用Python中的BeautifulSoup库解析HTML。BeautifulSoup是Python中用于解析HTML和XML文档的第三方库,它提供了简单易用的API,使得解析HTML和XML文档变得非常容易。 步骤1:安装BeautifulSoup库 在学习BeautifulS…

    python 2023年5月15日
    00
  • Python中os模块的12种用法总结

    Python 中 os 模块的 12 种用法总结 os 模块是 Python 中一个管理操作系统相关变量和函数的模块,可用于操纵文件和目录名,以及管理进程等。下面总结了 os 模块的12种用法和示例说明。 1. 获取当前工作目录 当前工作目录是指执行程序时所在的目录。 >>> import os >>> os.getcwd…

    python 2023年5月13日
    00
  • python中实现修改图像分辨率大小

    下面我将详细讲解 python 中实现修改图像分辨率大小的完整攻略。主要分为两个步骤:读取并修改图像、保存修改后的图像。 读取并修改图像 要实现修改图像分辨率大小,我们需要先读取图像,然后进行修改。Python 中有很多图像处理库可以使用,比如 PIL(Pillow)、OpenCV、scikit-image 等。这里以 PIL(Pillow) 为例,介绍如何…

    python 2023年5月18日
    00
  • Python实战实现爬取天气数据并完成可视化分析详解

    Python实战实现爬取天气数据并完成可视化分析详解 在本攻略中,我们将介绍如何使用Python爬取天气数据,并使用Python的数据可视化库Matplotlib和Seaborn完成可视化分析。我们将提供两个示例,用于说明如何使用Python爬取天气数据和完成可视化分析。 步骤1:获取天气数据 在使用Python爬取天气数据之前,我们需要获取天气数据的URL…

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