数据结构——桶式排序

来源:互联网 发布:淘宝客服售前问题用语 编辑:程序博客网 时间:2024/05/21 06:44

     基本上内存排序算法讲到这儿,就算是讲完了,对于一般的内部排序,我们选用的方法不是插入排序、希尔排序(使用sedgewick增量),就是快速排序,这三者随元素个数的增加而更加适合(即元素越多越选择后面的方法,堆排序的效率远低于希尔排序和快速排序,问题可能出于它需要很多额外的元素移动操作)。我并没有写关于排序的一般下界的分析,但我们这次将直接使用分析得出的结论:只使用元素间比较的任何排序算法下界均为Ω(N*logN)。



但是我们的思想不应就此被完全局限,因为在某些特殊情况下,以线性时间完成排序还是可能的



根据已知结论,使用元素比较进行排序的算法是无法做到以线性时间进行排序的,也就是说我们所说的特殊情况必然不是靠比较元素来进行排序,这也就说明:我们必然需要有对排序有帮助的额外的信息。我们这次要说的桶式排序即是如此。要想能够使用桶式排序,我们必须知道所有输入的可能情况!并且需要额外的数组空间来辅助排序(但我们并不会像堆排序一样使用那么多额外的元素移动操作)。



其思想很简单,关键点在于我们已经确定了会有多少种输入。举例说,我们已知输入将是正整数,并且一定不会大于10000,那么我们就可以int a[10000]={ 0 };这样一来整个数组每个元素都初始化为0,而每个下标即对应一种输入情况,下标对应存储的数值即该输入有多少次,例如我们输入189,则a[189]++当输入结束时,根据下标对应数值(即该下标对应输入情况的次数)即可快速完成排序,花费的时间为ON)!



桶式排序的思想很简单,实现也简单(难点在于所需空间大小可能会很大很大),重点在于它告诉我们一个信息:如果有可以用上的已知信息,那么算法就可以做到很快很快!(类似的例子还有:接近排序的元素使用插入排序将会很快,如果我们知道它快要排好序的话,这也是希尔排序的思想起源!)

0 0