Python实现桶排序

2023-10-27

Python实现桶排序

一、桶排序简介

桶排序(Bucket sort)是一种通过分桶和合并实现的排序算法,又被称为箱排序。

桶排序先将数据分到有限数量的桶里,然后对每一个桶内的数据进行排序(桶内排序可以使用任何一种排序算法,如快速排序),最后将所有排好序的桶合并成一个有序序列,列表排序完成。

桶排序需要占用很多额外的空间,对桶内数据进行排序,选择哪种排序算法对于性能的影响至关重要。桶排序适用的场景并不多,用得多一点的是基于桶排序思想的计数排序和基数排序。

二、桶排序原理

桶排序的原理如下:

1. 求出待排序列表中的最大值和最小值,得到数据的范围。

2. 根据数据的范围,选择一个适合的值构建有限数量的桶,确定每个桶的数据范围。如数据范围是[0,100),将数据分成10个桶,第一个桶为[0,10),第二个桶为[10,20),以此类推。

3. 将待排序列表中的数据分配到对应的桶中。

4. 对每一个桶内的数据进行排序,这里可以采用任意一种排序算法,建议采用时间复杂度小的排序算法。

5. 将所有桶中的数据依次取出,添加到一个新的有序序列中,列表排序完成。

以列表 [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8] 进行升序排列为例。列表的初始状态如下图。

1. 求出待排序列表中的最大值和最小值,选择一个值来分配桶的数量。例子中的最大值为9,最小值为2,分配三个桶。

2. 走访待排序列表,依次将每一个数据分配到对应的桶中。5属于第二个桶的范围,放到第二个桶中。

3. 继续走访待排序列表,进行分桶。7属于第二个桶的范围,放到第二个桶中。

4. 继续走访待排序列表,进行分桶。3属于第一个桶的范围,放到第一个桶中。

5. 继续走访待排序列表,进行分桶。7属于第二个桶的范围,放到第二个桶中。

6. 一直走访完整个待排序列表,将所有数据都放到对应的桶中。

7. 对每一个桶内的数据进行桶内排序,需要对待排序列表升序排序,所以每个桶内都进行升序排序。

8. 依次取出所有桶中的数据,添加到已排序序列中。先取出第一个桶中的数据,2,2,3,3 。

9. 继续取出第二个桶中的数据,5,5,5,7,7,7 。

10. 继续将所有桶中的数据都取出,添加到已排序序列中,列表排序完成。排序结果如下图。

三、Python实现桶排序

# coding=utf-8
def bucket_sort(array):
    min_num, max_num = min(array), max(array)
    bucket_num = (max_num-min_num)//3 + 1
    buckets = [[] for _ in range(int(bucket_num))]
    for num in array:
        buckets[int((num-min_num)//3)].append(num)
    new_array = list()
    for i in buckets:
        for j in sorted(i):
            new_array.append(j)
    return new_array


if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 8]
    print(bucket_sort(array))

运行结果:

[2, 2, 3, 3, 5, 5, 5, 7, 7, 7, 8, 9]

代码中,使用Python内置函数max()和min()求出了待排序列表中的最大值和最小值。然后设定每个桶的数据范围为3,创建出三个桶,再将数据添加到对应的桶中。取出每一个桶,对每个桶内的数据都进行排序,代码中直接使用了Python的内置函数sorted(),这里也可以使用快速排序等排序算法。桶内的数据排好序之后,依次将每一个桶中的数据添加到一个有序序列中,列表排序完成。

代码中的 i 表示第 i 个桶,j 表示对桶内数据排序后的第 j 个数据。

四、桶排序的时间复杂度和稳定性

1. 时间复杂度

在桶排序中,需要走访待排序列表中的每一个元素,进行分桶,列表长度为 n ,然后需要对每一个桶进行桶内排序,单个桶内排序的最坏时间复杂度是 O(ni^2),ni 表示第 i 个桶内有 ni 个数据,一共有 k 个桶,时间复杂度为n加每一个桶内排序的时间复杂度,最坏情况下所有数据全被分到了一个桶内,ni=n,时间复杂度为T(n)=n+n^2,再乘分桶和排序的步骤数(常数,不影响大O记法),所以桶排序的时间复杂度为 O(n^2) 。

桶排序的最优情况是将数据均匀地分配到每一个桶中,此时有k个桶,每个桶内有n/k个数据,每个桶内排序的平均时间复杂度为O(n/k*logn/k),整个桶排序的时间复杂度为T(n)=n+k*n/k*logn/k,而当k=n时,即每个桶内只有一个元素(不需要进行桶内排序),时间复杂度为O(n)。

2. 稳定性

根据桶排序的排序原理,会将待排序列表进行分桶、桶内排序和合并。在对每一个桶进行桶内排序时,可以采用不同的排序算法,有些排序算法是稳定的,有些排序算法是不稳定,这会影响到桶排序的稳定性。所以桶排序的稳定性取决于桶内排序算法的稳定性。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现桶排序 的相关文章

  • ssh连接远程主机执行脚本的环境变量问题

    近日在使用ssh命令ssh user remote myscript sh登陆到远程机器remote上执行脚本时 遇到一个奇怪的问题 myscript sh line n app command not found app是一个新安装的程序
  • ElasticSearch7之function_socre使用心得

    介绍 1 function score是可以修改查询检索文档的分数 使用function score必须定义 一个查询和一个或多个函数 为查询返回的每个文档计算一个新的分数 function score提供的评分函数 1 weight 设置

随机推荐

  • UReport2 报表设计器 在线表格

    UReport2官网 一 UReport2报表设计器 UReport2是一个开源的可视化报表设计器 功能强大 操作简单 可以实现复杂的报表统计 有各种各样的导出和打印功能 支持导入Excel表格 1 报表设计器 2 设计一个简单的用户列表展
  • ifstream之seekg/tellg

    声明 我个人特别讨厌 收费专栏 关注博主才可阅读等行为 推崇知识自由分享 推崇开源精神 呼吁你一起加入 大家共同成长进步 在文件读写的时候 一般需要借助fstream来进行文件操作 常见的操作有seekg 和tellg 但是这两个函数有一些
  • 机器学习之——单变量线性回归

    线性回归 线性回归 Linear Regression 作为Machine Learning 整个课程的切入例子确实有独到的地方 以简单的例子为出发点 将学习任务的主干串起来 问题的建模可以简单如下图所示 线性回归可以分为单变量线性回归 L
  • media sdk 性能优化

    https software intel com sites default files m 2 0 a 7 9 28439 Intel Media SDK E4 B9 8B E4 BC 98 E5 8C 96 E6 8A 80 E6 9C
  • SQLServer开启远程连接

    一 在需要被远程连接的电脑客户端中打开命令提示符输入 ipconfig 找到IPV4地址 二 在SQLServer配置管理器中找到端口 三 1 打开 控制面板 2 打开 系统和安全 3 打开 WindowDefender防火墙 4 打开 高
  • C#中 Console方法介绍

    一般情况下 我们用来输入信息的方法主要是用到如下四个 1 console log 用于输出普通信息 2 console info 用于输出提示性信息 3 console error 用于输出错误信息 4 console warn 用于输出警
  • 20世纪最好的十大算法、算法笔记(2008-11-15 22:16:57、2011-04-21 19:29:05)

    Algorithm 算法 一词与9世纪的阿拉伯学者al Khwarizmi有关 他写的书 al jabr w al muqabalah 代数学 演变成为现在中学的代数教科书 Ad Khwarizmi强调求解问题的有条理的步骤 20世纪最好的
  • 启动虚拟机异常(完整版)——如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从未重新启动,则Intel VT-x处于禁用状态

    创建了Linux虚拟机 点击 开机 之后 报了这个错误 笔记本电脑 我的 联想天逸 笔记本电脑 许多键与其他的 比如 华硕笔记本电脑 不同 想在操作系统中按F2 要Fn加 减音量 才有F2的功能 我将这个思想带到 启动BIOS 中 害惨了我
  • vue 使用 wangeditor 富文本编辑器

    wangeditor 是一个轻量级 web 富文本编辑器 配置方便 使用简单 1 安装 wangeditor 终端安装 wangeditor 库 yarn add wangeditor editor 或者 npm install wange
  • 腾讯云数据库CDB技术演进之路

    IT168 专稿 本文根据 2016 第八届系统架构师大会 微信搜索SACC2013 关注系统架构师大会公众号 现场演讲嘉宾程彬老师分享内容整理而成 录音整理及文字编辑IT168 田晓旭 老鱼 嘉宾简介 程彬 腾讯基础架构部数据库研发负责人
  • SQLSERVR 转换为数字类型numeric时出现算数溢出错误

    SQLSERVR 转换为数字类型numeric时出现算数溢出错误 情况一 在SQLSERVER中 关于数据的计算可能会导致出现如下的错误 遇到这类问题 一般都是由于结果超过了这个字段的长度 个字段的属性的概念 create table T1
  • 教你怎么用Vulnhub来搭建环境

    0x01 前言 Vulnhub它是一个提供各种漏洞环境的平台 里面大部分的环境是要用VMware或者VirtualBox打开运行的 如果只是练习一些常见的漏洞可以看我另外两篇用Docker来搭建各种漏洞靶场 妈妈再也不用担心我没有靶场练习了
  • 递归实现全排列

    设 R r1 r2 rn 是需要排列的 N 个元素 Ri R ri 设集合 中的元素 全排列记 为 Perm X ri Perm X 表示在 全排列 Perm X 的每一个排列前加上前缀 ri 得到的全排列 例如在 Perm X 的排列为
  • [java]java使用AES加密解密 ,AES-128/192/256-ECB加密模式

    直接上代码 是在springboot下直接test的 import org apache commons codec binary Base64 import org junit Test import org junit runner R
  • 【Linux 驱动篇(四)】设备树

    文章目录 一 什么是设备树 二 DTS DTB 和 DTC 三 DTS 语法 1 dtsi 头文件 2 设备节点 3 标准属性 3 1 compatible 属性 3 2 model 属性 3 3 status 属性 3 4 address
  • 4种线程池详解

    要配置一个线程池是比较复杂的 尤其是对于线程池的原理不是很清楚的情况下 很有可能配置的线程池不是较优的 因此在Executors类里面提供了一些静态工厂 生成一些常用的线程池 文章目录 ExecutorService概述 newSingle
  • HttpComponents(Apache HttpComponents Client 4.1.3)通过代理访问网页的设置方法

    HttpClient httpclient new DefaultHttpClient 这里是设置代理服务器的地方 HttpHost proxy new HttpHost 10 10 228 43 808 http httpclient g
  • win7 升级到 win10

    摘要 项目上遇到一个问题 客户提供一个软件在设备上点击运行后 转圈加载下就没有下文了 但是其他的软件又能正常运行 尝试了漏洞修护 系统修护 兼容性运行 管理员运行 32位兼容性进程检测等方式都不行 只能采取将win7升级到win10一试 在
  • vue学习,v-for不渲染

    最近在学习vue 使用axios v for做个搜索天气的小练习 发现只有第一次搜索有数据 改变数组后vue for不渲染 但使用console log可以看到数据确实更新了 使用this forceUpdate 这个不起作用 没办法了 只
  • Python实现桶排序

    Python实现桶排序 一 桶排序简介 桶排序 Bucket sort 是一种通过分桶和合并实现的排序算法 又被称为箱排序 桶排序先将数据分到有限数量的桶里 然后对每一个桶内的数据进行排序 桶内排序可以使用任何一种排序算法 如快速排序 最后