鸽巢排序(pigeon sort)

鸽巢排序(Pigeonhole sort) , 也被称作基数分类 , 是一种时间复杂度 为O (N+n )且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用,同时也要求元素个数(n)和成为索引的值(N)大小相当。

 

作用在数组上,索引时间为常量值O(1),则有

 

最坏时间复杂度: O(N+n)

最好时间复杂度:O(N+n)

平均时间复杂度: O(N+n)


最坏空间复杂度:O(N*n)

 

 

算法:

1. 给定一个待排序数组,创建一个备用数组(鸽巢),并初始化元素为0,备用数组的索引即是待排序数组的值。

2.把待排序数组的值,放到“鸽巢”里(即用作备用数组的索引)。

3.把鸽巢里的值再依次送回待排序数组。

 

算法伪代码(类似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源码:

 

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

 

 



更正:

1.(Dec ,6 ,2010)            最坏空间复杂度应该是O(N+n) . wikipedia.org的是错误的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考:

 

维基百科

wikipedia's pigeonhole_sort

你可能感兴趣的:(算法,python,2010)