鸽巢排序
分享一个思路极其朴素的排序算法实现。鸽巢排序(Pigeonhole Sort)是个思路极其朴素的算法:适用于元素数量和取值范围大致相同的场景。
基本思路
- 找到数组的最大值 max 和最小值 min,取值范围就是
range = max - min + 1 - 开一个大小为 range 的”鸽巢”数组,初始为空
- 遍历原数组,每个元素
arr[i]放进下标为arr[i] - min的鸽巢里 - 顺序遍历所有鸽巢,把非空的元素依次放回原数组
时间复杂度 O(n + Range),n 是元素个数,Range 是取值范围。
代码实现
1 | void pigeonholeSort(int arr[], int n) |
适用场景
鸽巢排序用途有限,因为它要求元素个数和取值范围大致接近。比如给 100 个人的考试分数排序(分数范围 0~100),它就是 O(n) 的神;但如果范围远远大于元素个数,空间开销就不划算了,这时候用桶排序——它的泛化版本——会更有效率。
理解了鸽巢排序,再看计数排序和桶排序就是水到渠成的事。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 寰宇体的世界!
评论
GiscusTwikoo
