算法是个什么玩意儿-桶排序和鸽巢排序
楼主,刚才看了你的帖子,看得出你是用心思考和实践过,
但是 说你这个方式, 我看你的代码确实不能实现 如果有重复数字的情况,
有一种解决方式是分桶,每个桶都是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次那就是桶排序。
例如
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+",");
}
}
}
参考:
本文出自 “JAVA那些事儿” 博客,请务必保留此出处http://1027187712.blog.51cto.com/5509347/1625380
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。