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中list列表的高级函数

    以下是详细讲解“Python中List列表的高级函数”的完整攻略。 在Python中,列表是一种常用的数据类型,提供了许多高级函数来操作列表。本文将介绍Python中List列表的高级函数,并提供两个示例说明。 高级函数 1. map() map()函数用于对列表中的每个元素应用一个函数,并返回一个新的列表。例如: lst = [1, 2, 3, 4] ne…

    python 2023年5月13日
    00
  • python集合是否可变总结

    Python中的集合(set)是一种无序且不可重复的数据结构。Python中的集合类型分为可变集合(set)和不可变集合(frozenset),其中可变集合是可以被修改的,而不可变集合则是不可被修改的。那么,Python集合是否可变呢? Python集合是否可变总结 总结如下: 可变集合(set)是可变对象,可以被修改,增加、删除元素。 不可变集合(froz…

    python 2023年5月13日
    00
  • Python高级编程之继承问题详解(super与mro)

    Python高级编程之继承问题详解(super与mro) 继承的重要性 在面向对象编程中,我们经常需要重用已有的代码。继承是以一个已有类为基础,创建新类的一种方式。新类会自动获得基础类的所有属性和方法,而无需重新编写。 继承中的问题 在Python中,继承有很多种方式,但不同的方式也会有不同的问题。在本文中,我们主要讨论两种常见的问题:继承冲突以及父类构造函…

    python 2023年5月13日
    00
  • Python实现爬取天气数据并可视化分析

    Python实现爬取天气数据并可视化分析 本文将介绍如何使用Python爬取天气数据,并使用可视化工具对数据进行分析和展示。我们将使用BeautifulSoup库解析HTML文档,使用requests库获取网页数据,使用pandas库处理数据,使用matplotlib库进行可视化分析。 爬取天气数据 以下是一个示例代码,演示如何使用Python爬取天气数据:…

    python 2023年5月15日
    00
  • python 将print输出的内容保存到txt文件中

    将 Python 中 print 方法输出的内容保存为 txt 文件可以利用 Python 的文件操作功能。下面是完整攻略的步骤: 1. 打开文件 使用 Python 内置的 open 函数,可以打开一个文件。在这个函数中要定义文件路径(可以是相对或绝对路径)和打开文件的模式(读取、写入、追加等)。要将文件保存为 txt 格式,需要将模式设置为写入(’w’)…

    python 2023年6月5日
    00
  • python list中append()与extend()用法分享

    Python列表中append()与extend()用法分享 在Python中,列表是一种非常常用的数据类型,用于存储一组有序的元素。列表可以包含不同类型的元素,包括数字、字符串、布尔值等。本文将详细介绍Python列表中append()与extend()的用法,包括它们的区别、使用方法以及示例说明。 append()方法 append()方法用于在列表的末…

    python 2023年5月13日
    00
  • python 实现自动远程登陆scp文件实例代码

    下面我将详细讲解“Python实现自动远程登录SCP文件实例代码”的完整攻略,包含以下内容: 实现SCP文件传输的基本原理 Python实现自动远程登录SCP文件实例代码的流程 示例代码说明 1. 实现SCP文件传输的基本原理 SCP是基于SSH协议的一种文件传输协议,它可以实现文件在远程服务器之间的传输。其基本原理是使用SSH协议建立一个加密通道,然后在该…

    python 2023年5月19日
    00
  • Python中的自定义函数学习笔记

    下面是关于“Python中的自定义函数学习笔记”的完整攻略。 基本概念 在Python中,函数是可复用的代码块。它们允许我们将一段代码作为单独的、独立的实体来组织和使用。Python可以使用内置函数,但我们也可以通过自定义函数来实现更加灵活的功能。 函数以def关键字开始,后面跟着函数名和一组括号,可以有参数和返回值。函数定义必须以冒号“:”结尾,并缩进代码…

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