原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了]

鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序

例如

var pigeonHole = new int[100];

pigeonHole[0]的值表示0的出现次数...

pigeonHole[1]的值表示1的出现次数...

pigeonHole[2]的值表示2的出现次数...

举例

var pigeonHole = new int[10];//10个位置

var A = new int[] { 6, 6, 2, 2, 2, 4, 1, 1, 1, 5, 5, 5, 5, 9 };//待排序数组

foreach (var item in A)

            {

                pigeonHole[item]++;//如pigeonHole[6]++会执行两次,结果为2

            }

鸽巢索引:0 1 2 3 4 5 6 7 8 9

索引次数:0 3 3 0 1 4 2 0 0 1

//顺序输出

for (int i = 0; i < pigeonHole.Length; i++)//索引i就是值

            {

//pigeonHole[i]处的值是数字i出现的次数

//如6出现了两次,那么pigeonHole[6] = 2

//0没出现,那么pigeonHole[0] = 0,表示待排数组里没有这个值:0

for (int j = 0; j < pigeonHole[i]; j++)//i出现就次就输出几个

                {

Console.WriteLine(i);//1,1,1,2,2,2,4,5,5,5,5,6,6,9

                }

            }

参考http://hi.baidu.com/wangxvfeng101/blog/item/a2c22560e57260c58cb10d8c.html