您的位置:首页 > 编程语言 > Java开发

算法是个什么玩意儿-桶排序和鸽巢排序

2015-03-27 11:24 253 查看
楼主,刚才看了你的帖子,看得出你是用心思考和实践过,
但是 说你这个方式, 我看你的代码确实不能实现 如果有重复数字的情况,
有一种解决方式是分桶,每个桶都是List,在每个List中进行排序,

另一种 我看到有个鸽巢排序

他是用数组下标表示要排序的数,用元素值来表示出现的次数,
跟桶排序有异曲同工之妙 ,
例如 8 ,9,9 ,6,
定义长度是10的数组,然后 一次是 0,0,0,0,0,0,1,0,1,2
组成一个这样的数组, 数组的第10个数的下标是9 出现了2次
不知道我的说法你能不能接受?如果语言不周 恕我冒犯了。

对桶排序 有两种理解,一种是 把1000个数字分成10个桶,每个桶单独排序,然后再进行输出

另一种思想是10个数字对应1个桶数组,每个数字的次数是1次,无重复,把1放到下标是1的位置上,
把2放到下标是2的位置上,把9放到下标是9的位置上,然后输出。

static int[] bucket_sort(int[] unsorted, int maxNumber = 99)
{
int[] sorted = new int[maxNumber + 1];
for (int i = 0; i < unsorted.Length; i++)
{
sorted[unsorted[i]] = unsorted[i];
}
return sorted;
}
static void Main(string[] args)
{
int[] x = { 99, 65, 24, 47, 50, 88,33, 66, 67, 31, 18 };
var sorted = bucket_sort(x, 99);
for (int i = 0; i < sorted.Length; i++)
{
if (sorted[i] > 0)
Console.WriteLine(sorted[i]);
}
Console.ReadLine();
}
参考代码来源,http://www.cnblogs.com/kkun/archive/2011/11/23/2260267.html

(鸽巢排序)
鸽巢排序Pigeonhole sort
原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了]
鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序。

[b]例如[/b]
var pigeonHole = new int[100];
pigeonHole[0]的值表示0的出现次数...
pigeonHole[1]的值表示1的出现次数...
pigeonHole[2]的值表示2的出现次数...

static int[] pogeon_sort(int[] unsorted, int maxNumber)
{
int[] pogeonHole = new int[maxNumber + 1];
for (int item : unsorted) {

pogeonHole[item]++;
}
return pogeonHole;
/*
* pogeonHole[10] = 4; 的含意是
* 在待排数组中有4个10出现,同理其它
*/
}

/**
* @param args
*/
public static void main(String[] args) {
// int[] x = { 99, 65, 24, 47, 47, 50, 99, 88, 66, 33, 66, 67, 31, 18, 24 };

int[] x = { 1,2,33,9,8,6,10,2};

int[] sorted = pogeon_sort(x, 33);

System.out.println(Arrays.toString(x));

for (int i = 0; i < sorted.length; i++)
{
for (int j = 0; j < sorted[i]; j++)
{
System.out.print(i+",");
}
}
}
参考:
http://www.cnblogs.com/kkun/archive/2011/11/23/2260273.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息