Python 算法高级篇:桶排序与基数排序

Python 算法高级篇:桶排序与基数排序

  • 引言
  • 什么是桶排序?
    • 桶排序的基本步骤
    • 桶排序的示例
  • 什么是基数排序?
    • 基数排序的基本步骤
    • 基数排序的示例
  • 桶排序与基数排序的应用
    • 桶排序的应用
    • 基数排序的应用
  • Python 示例代码
  • 总结

引言

在算法高级篇的课程中,我们将探讨两种非常有趣的排序算法:桶排序( Bucket Sort )和基数排序( Radix Sort )。这两种排序算法虽然不如快速排序和归并排序那样出名,但在某些特定情况下,它们能够以线性时间复杂度( O ( n ))运行,而不是标准排序算法的 O ( n log n )。

什么是桶排序?

桶排序是一种分布式排序算法,它将元素分为若干个"桶",然后分别对每个桶进行排序。最后,将这些桶按顺序合并以获得排好序的结果。这个算法的性能非常依赖于数据的分布,对于均匀分布的数据,它的性能会非常好。

桶排序的基本步骤

  • 1 . 创建一定数量的空桶,这些桶的数量可以根据输入数据的范围来确定。
  • 2 . 将每个元素放入对应的桶中。元素的放入可以使用不同的策略,最简单的是线性映射,即将数据范围均匀分配到各个桶中。
  • 3 . 对每个非空的桶进行排序,可以使用其他排序算法,或者递归使用桶排序。
  • 4 . 将各个桶中的元素按顺序合并,得到排序后的结果。

桶排序的示例

让我们看一个简单的桶排序示例,假设我们有一个包含 099 之间整数的列表:

[78, 17, 39, 26, 72, 94, 21, 12, 23, 68]

首先,我们创建 10 个桶,每个桶代表一个数字范围,例如,第一个桶包含 09 之间的数字,第二个桶包含 1019 之间的数字,以此类推。

Bucket 0: [ ]
Bucket 1: [ ]
Bucket 2: [ ]
...
Bucket 9: [ ]

然后,我们将列表中的元素分别放入这些桶中,根据个位数的值将它们分配到不同的桶中。

Bucket 0: [78]
Bucket 1: [21]
Bucket 2: [12, 72, 23]
Bucket 3: [39]
Bucket 4: []
Bucket 5: [26]
Bucket 6: []
Bucket 7: [17]
Bucket 8: [68]
Bucket 9: [94]

接下来,我们对每个桶中的元素进行排序,这里我们可以使用任何排序算法,如插入排序。

Bucket 0: [78]
Bucket 1: [21]
Bucket 2: [12, 23, 72]
Bucket 3: [39]
Bucket 4: []
Bucket 5: [26]
Bucket 6: []
Bucket 7: [17]
Bucket 8: [68]
Bucket 9: [94]

最后,我们按顺序合并这些桶,得到排序后的结果。

[12, 17, 21, 23, 26, 39, 68, 72, 78, 94]

这就是桶排序的基本过程。请注意,桶排序对于小范围内的整数或浮点数非常高效,但对于稀疏数据或数据范围较大的情况,可能不如其他排序算法高效。

什么是基数排序?

基数排序是一种非比较性排序算法,它将整数按照位数进行排序。基数排序通常用于对整数进行排序,特别是对于具有相同位数的整数集合。

基数排序的基本步骤

  • 1 . 将整数按照个位数的值分成 10 个桶,每个桶包含相同个位数的整数。
  • 2 . 将这些桶按顺序合并,得到一个部分排序的序列。
  • 3 . 重复以上两个步骤,但这次按照十位数进行排序。
  • 4 . 继续重复,直到按照最高位进行排序。

基数排序的示例

让我们看一个基数排序的示例,假设我们有一个整数列表:

[170, 45, 75, 90, 802, 24, 2, 66]

首先,我们按照个位数的值将它们分成 10 个桶:

Bucket 0: [170, 90]
Bucket 1: []
Bucket 2: [802, 2]
Bucket 3: []
Bucket 4: [24]
Bucket 5: [45, 75]
Bucket 6: [66]
Bucket 7: []
Bucket 8: []
Bucket 9: []

然后,我们按照桶的顺序合并它们,得到一个部分排序的序列:

[170, 90, 802, 2, 24, 45, 75, 66]

接下来,我们按照十位数的值将它们再次分成 10 个桶:

Bucket 0: [802, 2]
Bucket 1: []
Bucket 2: []
Bucket 3: [24]
Bucket 4: [45]
Bucket 5: [75]
Bucket 6: [66]
Bucket 7: []
Bucket 8: []
Bucket 9: [170, 90]

再次按照桶的顺序合并它们:

[802, 2, 24, 45, 75, 66, 170, 90]

最后,我们按照百位数的值将它们分成 10 个桶,然后合并它们:

[2, 24, 45, 66, 75, 90, 170, 802]

这就是基数排序的基本过程。它对于整数排序非常高效,尤其是当整数具有相同位数时。但对于不同位数的整数,需要在每一轮排序后重新分桶,因此它不太适合对范围广泛的整数排序。

桶排序与基数排序的应用

桶排序的应用

桶排序最适合用于排序 01 之间的小数,比如在计算机图形学中对颜色的排序,或者对学生成绩的百分比排序。在这些情况下,数据是均匀分布的,桶排序可以在线性时间内完成排序。

基数排序的应用

基数排序通常用于排序整数,特别是具有相同位数的整数。它在处理大整数的计算中也非常有用,例如大整数的加法和乘法运算。

Python 示例代码

下面是 Python 中的桶排序和基数排序的示例代码:

# 桶排序
def bucket_sort(arr):# 创建空桶buckets = [[] for _ in range(10)]# 将元素分配到桶中for num in arr:index = num // 10buckets[index].append(num)# 对每个桶中的元素进行排序for i in range(10):buckets[i] = sorted(buckets[i])# 合并桶result = []for bucket in buckets:result.extend(bucket)return result# 基数排序
def radix_sort(arr):# 计算最大位数max_num = max(arr)digits = len(str(max_num))for i in range(digits):# 创建空桶buckets = [[] for _ in range(10)]# 将元素分配到桶中for num in arr:index = (num // 10**i) % 10buckets[index].append(num)# 合并桶arr = []for bucket in buckets:arr.extend(bucket)return arr# 测试桶排序
arr1 = [78, 17, 39, 26, 72, 94, 21, 12, 23, 68]
sorted_arr1 = bucket_sort(arr1)
print("桶排序结果:", sorted_arr1)# 测试基数排序
arr2 = [170, 45, 75, 90, 802, 24, 2, 66]
sorted_arr2 = radix_sort(arr2)
print("基数排序结果:", sorted_arr2)

总结

桶排序和基数排序是两种非常有趣的排序算法,它们对于特定类型的数据和应用非常高效。桶排序适合于均匀分布的小数排序,而基数排序适合于整数排序,特别是具有相同位数的整数。通过将这些算法加入你的工具箱,你可以更好地处理各种排序问题,提高性能并应对不同类型的数据。希望这篇文章对你理解桶排序和基数排序有所帮助。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从设计、制造到封测,XSKY 智能存储助力半导体行业数字化转型

近日,ECS2023 第五届中国电子通信与半导体 CIO 峰会在深圳召开,峰会以“数字科技与业务重塑”为主题,汇聚了 300来自电子通信与半导体行业知名企业高管、CIO、信息化与数字化负责人,交流电子通信与半导体行业的创新的产品和解决方…

【排序】js简单实现前端数组排序,多字段数组对象排序,字符串排序,数字排序等

数组对象排序(多字段排序) 排序前: 排序后: data() {return {list: [{ks: 外科,child_ks: 泌尿外科,xz: 外科一组,doctor: 小明,num: 18,num2: 19,num3: 20},{ks: 中医科,child_ks: 中医男科,xz: 外科一组,doctor: 小红,num: …

Hadoop、Hive安装

一、 工具 Linux系统:Centos,版本7.0及以上 JDK:jdk1.8 Hadoop:3.1.3 Hive:3.1.2 虚拟机:VMware mysql:5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…

SpringBoot整合Gateway 的Demo(附源码)

源码&#xff0c;可直接下载 Gateway模块 Gateway 的父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 很喜欢‘万变不离其宗’这句话&#xff0c;希望在不断的思考和总结中找到Vue中的宗&#xff0c;来解答面试官抛出的…

2023MathorCup(妈妈杯) 数学建模挑战赛 解题思路

云顶数模最新解题思路免费分享~~ 2023妈妈杯数学建模A题B题思路&#xff0c;供大家参考~~ A题 B题

对mysql的联合索引的深刻理解

背景 对mysql的联合索引的考察是Java程序员面试高频考点&#xff01;必须深刻理解掌握否则容易丢分非常可惜。 技术难点 考察对最左侧匹配原理理解。 原理 暂且不表。网上讲这非常多。我理解就是&#xff0c;B树每个非叶子节点的值都是有序存放索引的值。 比如对A、B、C …

物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?

物联网&#xff08;IoT&#xff09;技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序&#xff0c;我们可以实现对医疗设备的远程访问、监控和管理&#xff0c;从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理&#xff…

appium操控微信小程序的坑

appium操控微信小程序的坑 打不开启动页面driver的context只有NATIVE_APP小程序上元素找不到 我打算使用appium操控微信小程序&#xff0c;只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。 打不开启动页面 以下是我的appium的配置参数和代码&#xff1a; de…

Hyperledger Fabric搭建测试网络

本文使用的Fabric版本&#xff1a;V2.5.4 Ubuntu系统&#xff1a;16.04LTS 前序文章已经详细介绍了如何安装部署Hyperledger Fabric系统&#xff0c;这里不再赘述。本篇文章主要介绍如何使用Fabric的测试网络。在正式开始之前&#xff0c;有一点需要说明&#xff1a; Hyperled…

24 行为型模式-访问者模式

1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式。 2 访问者模式原理 3 访问者模式实现 我们以超市购物为例,假设超市中的三类商品: 水果,糖…

JVM(二)

一,运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。 1.1 程序计数器 程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址。 在加载阶段,虚拟机将字节码文件中的指令读取…

多线程面试相关知识点

文章目录 (一) 进程线程和协程的区别创建线程的4种方式1. 继承Thread类2. 实现runnable接口3. 实现Callable接口4. 线程池创建 runnable 和 callable 有什么区别线程的 run()和 start()有什么区别&#xff1f;线程之间的状态变化notify()和 notifyAll()有什么区别&#xff1f;j…

HPV感染的风险:闫会宁主任分析酒店环境中的常见因素

人类乳头瘤病毒(HPV)是一种普遍存在的病毒&#xff0c;其存在和传播方式多种多样。近年来&#xff0c;人们对于HPV的认识不断深入&#xff0c;知道其在酒店环境中的传播风险。本文将探讨哪些情况下在酒店可能感染HPV。 一、HPV的传播方式 HPV主要通过直接接触传播&#xff0c…

数据湖Iceberg介绍和使用(集成Hive、SparkSQL、FlinkSQL)

文章目录 简介概述作用特性数据存储、计算引擎插件化实时流批一体数据表演化&#xff08;Table Evolution&#xff09;模式演化&#xff08;Schema Evolution&#xff09;分区演化&#xff08;Partition Evolution&#xff09;列顺序演化&#xff08;Sort Order Evolution&…

python:使用Scikit-image对遥感影像进行梯度特征提取(gradient)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-Image来进行梯度特征提取(gradient),并且提供一个示例代码,演示了如何在单波段遥感图像上应用这些方法。 梯度特征是指用于表示图像中亮度或颜色变化的特征。它包括两个关键成分:梯度幅值和梯度方向。梯度幅…

RabbitMQ (4)

RabbitMQ (4) 文章目录 1. 死信的概念2. 死信的来源3. 死信代码案例3.1 TTL 过期时间3.2 超过队列最大长度3.3 拒绝消息 前言   上文我们已经学习完 交换机 &#xff0c;知道了几个交换机的使用 &#xff0c;下面我们来学习一下 死信队列 1. 死信的概念 先从概念解释上搞清楚这…

【C++】mapset的底层结构 -- AVL树(高度平衡二叉搜索树)

前面我们对 map / multimap / set / multiset 进行了简单的介绍&#xff0c;可以发现&#xff0c;这几个容器有个共同点是&#xff1a;其底层都是按照二叉搜索树来实现的。 但是二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索…

漏洞复现-phpmyadmin_SQL注入 (CVE-2020-5504)

phpmyadmin SQL注入 _&#xff08;CVE-2020-5504&#xff09; 漏洞信息 CVE-2020-5504sql注入漏洞Phpmyadmin 5.00以下 描述 ​ phpMyAdmin是Phpmyadmin团队的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库&#xff0c;创建、删除、修改数据库表&…