一旦跳出了“排序就比较”这个思维,那我们就有可能实现更低的复杂度,当然代价就是对输入的数据有一定的限制。
1,count 限制条件就是元素的数值在(0,k), 最好不要出现负数(虽然有些也是可以解决),值不要太大(具体就是值的跨度不要太大),基本思路就是开辟K个空间,统计数组中小于i的个数,然后以数组逆序遍历直接安放该元素。这里面充满了“hash”的味道,相当于每个数都有一个独立的空间来对应,避免了“比较”, 得到O(K+N),无论是空间还是时间,K不能太大,否则失去意义。
2,radix 显然扩大了排序的限制条件,至少数值可以更大
3,bucket 限制条件为数据的统计贴近均匀分布, 其实还是hash 的作用,假设输入数据均匀分布,那么将其归一[0,1), 最理想情况下,划分为n个bucket,刚好每个元素落入一个bucket(这其实就是hash),,然后顺序输出即可,当然对于那些接近均匀分布的可以证明也可以实现O(n), 当然他需要额外的空间(毕竟是hash嘛)!