桶排序、计数排序、基数排序的介绍
1.非基于比较的排序,与被排序的样本的实际数据状况很有关系,所以在实际中并不经常使用
2.时间复杂度为O(N),额外空间复杂度O(N)
3.稳定的排序
4.例子:桶排序,容器,一种数据状况出现的词频。桶排序可以分为两种具体的实现:基数排序和计数排序,计数排序就是桶排序的一个具体的体现
(1)假设数组中的所有的数的范围是0-60,请将这个数组的数排好,做法是:生成一个长度为61的数组,遍历这个数组,开始的时候,每个元素的个数都是0,在遍历的过程中,遇到某个数就在这个数字上面加1,将相应位置上的词频加起来,当遍历完后,从0到60的词频都有了,然后重塑这个数组,将相应词频的数组拷贝下来,就可以将整个原始数组拷贝下来,不基于比较的方式进行排序,时间复杂度O(N)。
(2)比如-20亿到+20亿,用计数排序就不合适了。基数排序是将个位数先排序,然后十位数排序,百位数排序然后千位数排序,用桶的个数会比较少,是其优化和改进,计数排序也是和数据状况有关的排序,也不是基于比较的排序。基数排序是有局限性的。
5.补充问题:给定一个数组,求如果排序后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序。
(1)准备桶,如果数组中有N个数,那就需要N+1个桶,先遍历桶,找到最小值和最大值,如果最小值和最大值相等,说明整个数组就是一种数,最大差值是0,;如果最小值和最大值不等, 那么将最小值放在0号桶中,最大值放在第N号桶中,将最小值和最大值的范围等分为n+1份,中间范围的某个,一个数属于哪个范围,就放在哪个桶中。
如一个数组9个数,准备10个桶,最小值0,最大值99,将0-99范围中分为10份,0~9在0号桶,10~19在1号桶...90~99在9号桶里,中间的数,出现在哪个范围就放在哪个桶中,最小值放在0号桶里,最大数放在n号桶里,最左边的桶不可能空,最右边的桶也不可能空,中间必然存在一个空桶,
这n个数在进行排序之后,可能属于同一个桶,也可能属于不同的桶,设计空桶的目的是为了说明最大差值一定不来自相同桶的数。所以两个数的最大差值可能是来自前一个桶的最后值,和后一个桶的最小值,两个数最大差值一定不是来自一个桶内部的最大差值。
6.实现一个特殊的栈,在实现栈的基本功能的基础上,再shiainx