博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常用排序算法:桶排序
阅读量:6192 次
发布时间:2019-06-21

本文共 1165 字,大约阅读时间需要 3 分钟。

算法思路:

我们之前提到过计数排序,计数排序在某些情况下并不太适合,例如元素范围太大的情况,桶排序算是对于计数排序的一种改进,桶排序首先根据元素大小放置到不同的桶中,然后在对每一个桶内元素进行排序。

例如数组[29,25,3,49,9,37,21,43],可以以10为区间来存放元素,具体操作如下图:

关于“桶”这个结构怎么实现,在python里面可以用二位数组来表示[ [  ], [   ], [  ] ....],总得来说桶排序步骤:

            1 . 建桶
            2.  元素存放到桶里面
            3.  桶内元素进行排序(第二步和第三步可以合并到一起,因为初始的桶为空是有序的,每次只需执行一次插入即可保持有序
            4.  依次取出每个桶内元素

时间复杂度:平均O(n+k), 最坏O(n^2 * k)都放到一个桶里面了

空间复杂度:O(nk)

代码实现:

def bucket_sort(nums, buckets):    """    桶排序    :param nums: 无序数组    :param buckets: 桶个数    :return: 有序数组    """    bucket = [[] for x in range(buckets)]  # 创建空桶    num = max(nums) - min(nums) + 1    l = num // buckets + 1 if num % buckets else num // buckets   # 计算每个桶大小    for i in nums:        bucket_num = i // l # 计算元素应该放入到哪一个桶里面        bucket[bucket_num].append(i)        # 维护桶内元素有序。        # 因为之前的桶内是有序的,插入一个新的元素可以使用插入排序继续保持桶内有序        tmp = i        j = len(bucket[bucket_num]) - 2        while j >= 0 and bucket[bucket_num][j] > tmp:  # 执行插入操作            bucket[bucket_num][j + 1] = bucket[bucket_num][j]            j -= 1        bucket[bucket_num][j+1] = tmp    res = []    # 依次取出桶内元素    for i in bucket:        res.extend(i)    return res

 

转载于:https://www.cnblogs.com/FanMLei/p/10500992.html

你可能感兴趣的文章
第3章 抽象类
查看>>
[PHP]加密解密函数
查看>>
解析私有云服务器给企业带来的六大优势
查看>>
iptables1
查看>>
之所以一无所成,并不是我们不够努力
查看>>
如何对高管实施股权激励?
查看>>
centos搭建FTP文件服务
查看>>
华山模拟器安装
查看>>
Mysql实现企业级主从复制和互为主从模式架构
查看>>
电脑维修常见软件工具
查看>>
使用SSL证书保障网络游戏信息安全
查看>>
oracle db_link
查看>>
CentOS7.2编译安装LNMP
查看>>
Nginx负载平衡 + Tomcat + 会话存储Redis配置要点
查看>>
Scala学习 - 基础类型
查看>>
前端代码中经常遇到的问题
查看>>
我的友情链接
查看>>
MariaDB10.3 系统版本表 有效防止数据丢失
查看>>
常用命令分析局域网连通故障
查看>>
Ubuntu下配置舒服的Python开发环境
查看>>