原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了]
鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为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