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;
}