//鸽巢排序
//适用条件:所有取值的范围确定,并且在这个范围内个元素的出现频率较高。
//算法描述:为取值范围内的各个可能取到的元素建巢用一维数组表示,巢中
//    巢中存放该元素出现的个数(通过遍历待排序数统计存入)。按照巢的
//    顺序和巢中元素个数列出该有序序列。
//算法空间复杂度为:S(1)时间复杂度为:O(n)。

//例:20个非负数,其中每个数的取值范围为1~9。

#include<iostream>
#include<time.h>
using namespace std;
int myrand(int* src, int n)                      //随机函数,随机生成n个 0~9的数存入src数组中
{
    if(NULL == src||n < 0)         
    {
        cout << "err in args or 'n'" << endl;
        return 0;
    }
    else
    {
        srand(time(NULL));
        for(int i=0; i<n; i++)
        {
            src[i] = rand()%10;
        }
        return 1;
    }
}

void prin(const int* src, int n)                 //输出数组中的前n个元素
{
    for(int i=0; i<n; i++)
        cout << src[i] << "  ";
    cout << endl;
}

void home_sort(int arg[], int ar, int ser[], int se) //排序函数
{
    int i,j,t =0;
    for(i=0; i<ar; i++)
        ++ser[arg[i]];
    for(i=0; i<se; i++)
    {
            for(j=0; j<ser[i]; j++)
            {
                arg[t] = i;
                ++t;
            }
    }
}

int main()
{
    int arg[20],se[10] = {0};
    if(myrand(arg,20))
        prin(arg,20);
    home_sort(arg, 20, se, 10);
    prin(arg, 20);    
    return 0;
}