博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构(python) —— 【18排序: 桶排序】
阅读量:3943 次
发布时间:2019-05-24

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

桶排序

上一博文讲了计数排序,那么在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法?

桶排序(Bucket Sort): 首先将元素分在不同的桶中,再对每个桶中的元素排序
桶排序的表现取决于数据的分布,也就是需要对不同的数据排序时采取不同的分桶策略
平均情况复杂度: O(n+k)
最坏情况时间复杂度: O(k * n^2)
空间复杂度: O(nk)
桶排序原理很简单,比如一个列表中元素最大值是max=100000,按照计数排序,我们需要一个100000大小的列表,但是如果使用桶排序,则我们可以将0-1000放一个桶里,然后这个桶内每次放入一个元素就进行一次冒泡排序即将桶内也排好序;将1001-2000也放一个桶…这样最大值为100000的列表只需要放入100个桶中就行了。

代码:

'''TOP: 桶排序author: Bluetime: 2020-08-08QQ: 2458682080'''def bucket_sort(li, n=100, max_num=10000):    buckets = [[] for _ in range(n)]  # 创建桶——建立n个空一维列表的二维列表    for var in li:        i = min(var // (max_num // n), n - 1)   # i表示var这个数放到几号桶里        # max_num // n 表示每个桶有几个数        # 用min是为了防止比如10000这个数出现,按道理应该放到第100个桶,但我们只有0-99号桶,所以取较小值,让10000放进99号桶        buckets[i].append(var)  # 把var放进桶里        for j in range(len(buckets[i])-1, 0, -1):  # 放入桶后,用该桶最后一个数往前进行冒泡排序            if buckets[i][j] < buckets[i][j-1]:                buckets[i][j], buckets[i][j-1] = buckets[i][j-1], buckets[i][j]            else:                break    sorted_li = []    for buc in buckets:        sorted_li.extend(buc)    return sorted_liimport randomli = [random.randint(0, 10000) for i in range(10000)]li = bucket_sort(li)print(li)

结果为:

[0, 1, 1, 1, 1, 2, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 12, 12, 13, 15, 19, 22, 24, 25, 25, 26, 28, 28, 29, 29, 29, 30, 31, 35, 36, 37, 38, 41, 42, 42, 43, 45, 46, 51, 54, 54, 55, 57, 57, 58, 59, 60, 62, 63, 63, 66, 67, 69, 69, 69, 70, 70, 72, 75, 76, 77, 77, 79, 80, 82, 83, 84, 84, 87, 87, 89, 89, 90, 91, 91, 92, 92, 93, 93, 94, 94, 100, 100, 100, 100, 102, 104, 108, 108, 108, 108, 109, 110, 111, 113, 114, 115, 117, 119, 119, 120, 120, 121, 121, 124, 124, 125, 126, 127, 127, 128, 128, 128, 131.......]

转载地址:http://fbiwi.baihongyu.com/

你可能感兴趣的文章
用ffmpeg转多音轨的mkv文件
查看>>
ubuntu12.04 安装VLC,在root用户下不能使用的问题
查看>>
简单而又完整的Makefile
查看>>
GNU/Linux下如何卸载源码安装的软件
查看>>
ffmpeg 常用 命令随手记
查看>>
av_seek_frame中flags值的意义
查看>>
git 学习笔记
查看>>
C++类中的static的用法
查看>>
vector 释放内存 swap
查看>>
在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)
查看>>
在32位系统中使用fseek和lseek或fwrite、write写大文件时,最大只能写2G左右的解决办法
查看>>
整理华为C/C++编码规范
查看>>
C语言中嵌入正则表达式
查看>>
libxml2 指南(中文)
查看>>
虚拟机VMware中实现linux与windows的共享
查看>>
undefined reference问题总结
查看>>
souce insight 3.5 修改背景颜色
查看>>
Linux 关闭/开启图形界面(X-window) 命令
查看>>
debug 打印 开关 设计(for c || C++)
查看>>
vmware中虚拟机和主机ping不通的问题。
查看>>