华山论剑之桶排序

Posted 涛歌依旧

tags:

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

华山论剑的算法

     华山论剑开始,报名名单为:郭靖,黄蓉,洪七公,欧阳锋,欧阳克,周伯通,瑛姑,黄药师,杨康,穆念慈,柯镇恶,尹志平。

     要获取所有参赛者的最终排名,该如何设计算法呢?

     如果用冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序,可能导致一些既浪费时间又浪费表情的比赛,比如:

 洪七公 VS  尹志平

 欧阳锋 VS  欧阳克

 黄药师 VS  穆念慈


     可以考虑把参赛人分为四个水平段位,然后,在相同的水平段位中分别比较,这就是所谓的桶排序。

高水平 洪七公  欧阳锋  周伯通 黄药师
中水平
郭靖
低水平
黄蓉  欧阳克  瑛姑  杨康  柯镇恶
菜鸟级
穆念慈  尹志平     


浮点数的桶排序

      我们先看这样一个问题:

      问题:高考语数外三门课的满分都是150分,有N人参加这三门考试,请对考生的语数外三门课的平均分进行排序,要求时间复杂度尽可能低。


     基于比较的排序,时间复杂度不符合要求。计数排序()又无法处理浮点数。怎么办呢?还是来看排序吧。语数外三科的平均分区间是[0, 150], 且可能取小数,我们可以建立150个桶,如下:

华山论剑之桶排序

      遍历所有待排序分数,根据值的大小,塞入到对应的桶中,这个过程的时间复杂度为O(N). 分桶的过程,揭示了桶排序的本质:不同的桶之间,不需要比较,因为左边桶中的所有元素一定小于右边桶中的所有元素,减少了很多无用的比较。

     然而,每个桶内,还是需要比较的,可以采取快速排序。假设桶的个数为M, 平均每个桶内的元素个数为N/M,  桶排序的整体时间复杂度是:

O(N + M*N/Mlog(N/M))

     当M接近N时,上式近似简化为O(N),也就是说,此时桶排序是线性时间复杂度的排序。而当M=1时,只有一个桶,此时桶排序退化为快速排序,时间复杂度为O(NlogN). 所以,要合理选择桶的个数。


桶排序与计数排序

      回头想一下,计数排序其实是桶排序的特殊情况。计数排序时,桶中元素可能有c个完全相等的值,桶类不用排序,直接计数就可以了。比如,要对如下数据进行计数排序:

      a: {0, 1, 5, 3, 2, 2, 3, 0, 2, 6}

      可以引入7个桶:桶0中有20, 桶1中有1个1, 桶2中有3个2, 桶3中有23, 桶4无元素, 桶5中有1个5,桶6中有1个6,如图:

      可见,计数排序确实可以看作是桶排序的特殊情况。


桶排序解决海量数据问题

     在一些场景下,桶排序可以处理海量数据问题。比如,有这样一个问题:

     在A文件中有100亿个浮点数,请对这些数据进行排序。

     显然,无法直接把100亿个数据读到内存中,bitmap也没辙了。桶排序出场,步骤如下:

     a. 创建合理的文件数,每个文件对应一个桶,遍历100亿个浮点数,归类到对应的桶中。

     b. 分别把每个桶的元素加载到内存中,快速排序后,保存到对应的桶中。

     c. 遍历每个桶的元素,写入到文件中,完成100亿个数据的排序。

    可以看到,用桶排序解决海量数据问题,其本质是分治,桶天然具有分治的能力。在笔试和面试中,桶排序常常会有妙用。    


     桶排序引入了桶,耗费了空间,节省了时间,这种以空间换时间的技巧,在计算机科学中无处不在。

     我们描述了桶排序的算法,也分析了算法的时间复杂度,至于程序实现,那就比较简单了,便不再赘述。掌握思路,才是最重要的。





以上是关于华山论剑之桶排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之桶排序

第六章 算法秘籍之桶排序

排序算法之桶排序

算法:排序之桶排序和基数排序

十大排序算法之桶排序

重温基础算法内部排序之桶排序法