比快更快——桶排序

Posted 王子鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比快更快——桶排序相关的知识,希望对你有一定的参考价值。



因为我刚上大学就看过《编程珠玑》这本书,第一章就介绍了这个思想,于是答案脱口而出,也因此顺利的拿到了很高的评价(当然笔试成绩可能也是名列前茅吧)。


在场的同学列举了各种排序,甚至提到线程、分布式,也有非常接近的靠谱答案,当然这些也都是知识的积累。最后面试官悠悠的说一句,同学们很踊跃,各种各样的方法都很不错,但最佳的答案有一位同学最开始已经答出来了……balabala


这个方法叫桶排序。因为印象中,不论是数据结构还是算法课上,桶排序都太过简单,可能学过,但大多数同学对它都不会有什么特别的印象。


快排 O(nlogn) 五千万的数据量 50000000*log50000000 其比较次数在十亿级别。

但是桶排序 O(n) 其性能接近于 I/O 性能,在这个问题下就会显得非常快。



一个更适合桶排序的例子是,假如试卷满分 100 分,有成千上万的考生成绩需要排序,我们就仅仅需要一个 100 多的数组即可完成排序。多快好省。


当时面试的时候,我并没有很坚定的坚持自己的思路,因为我没有真实地试过这个规模的数据。于是回到学校就兴冲冲的写了两段代码,快排和桶排序做了个对比。


手头上也没有趁手的 IDE,没法实时监测性能,但是大致的结果已经很明了了。


代码如下:


比快更快——桶排序

没有写注释,不过程序本身很简单,加载数组,两个排序各跑一次,记录耗时。


比快更快——桶排序

比快更快——桶排序

性能上没有我想象中的那样毫秒级。当然可能是其他的开销对结果的影响太大。


完成排序所花费的时间,耗时越低越好。


简单的看了一下内存消耗,快排内存占用少了一些,但是差距不大。

接下来我还会尝试下 python 内存监测模块 memory_profiler 等,获得更精确的结果,做进一步的了解。


闲来无事不如多花些时间想想问题本身,多读些书。很多东西说白了都简单得不得了,但说不定哪天就用上了呢?


图为《编程珠玑》某页


以上是关于比快更快——桶排序的主要内容,如果未能解决你的问题,请参考以下文章

排序:桶排序Bucket sort

4.9 桶排序

线性排序:桶排序计数排序

线性排序:桶排序计数排序

桶排序和基数排序

排序算法——桶排序