鸽巢排序(Pigeonhole sort)

1鸽巢排序(Pigeonhole sort)编辑

鸽巢排序, 也被称作基数分类, 是一种 时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种 排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用.
当涉及到多个不相等的元素, 且将这些元素放在同一个"鸽巢"的时候, 算法的效率会有所降低.为了简便和保持鸽巢排序在适应不同的情况, 比如两个在同一个存储桶中结束的元素必然相等
我们一般很少使用鸽巢排序, 因为它很少可以在灵活性, 简便性, 尤是速度上超过其他 排序算法. 事实上, 桶排序较鸽巢排序更加的实用.
鸽巢排序的一个比较有名的变形是tally sort, 它仅仅适用非常有限的题目, 这个算法因在Programming Pearls一书中作为解决一个非常规有限集问题方法的例子而著名.
显然, 快速排序可以当作只有两个(有些情况下是三个)"鸽巢"的鸽巢排序

2算法效率编辑

最坏 时间复杂度: O(N+n)
最好 时间复杂度:O(N+n)
平均 时间复杂度: O(N+n)
最坏 空间复杂度:O(N*n)

3算法分析编辑

1. 给定一个待排序 数组,创建一个备用数组(鸽巢),并初始化元素为0,备用数组的索引即是待排序数组的值。
2.把待排序 数组的值,放到“鸽巢”里(即用作备用数组的索引)。
3.把鸽巢里的值再依次送回待排序 数组

4算法代码编辑

算法伪代码(类似Python代码格式)

def pigeonhole_sort ( array a[n] ) :
array auxiliary[N] = {0}
var i ,k
var j = 0
for i = 0 -> n
auxiliary[ a[i] ] ++
for i = 0 -> N
for k = 0 ->auxiliary[i]
a[j++] = i

C源码

函数功能:实现鸽巢排序
参数: *array 为需要排序的数组,length为数组长度
NUM 可以为全局变量 为待排序数组中最大的元素值
void pigeonhole_sort(int* array, int length)  {
int auxiliary[NUM] = {0};
int i, k,j = 0;
for(i = 0; i < length; ++i)
auxiliary[array[i]]++;
for(i = 0; i < NUM; ++i)
for(k = 0; k < auxiliary[i]; ++k)
array[j++] = i;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值