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

楼主,刚才看了你的帖子,看得出你是用心思考和实践过,
但是 说你这个方式, 我看你的代码确实不能实现 如果有重复数字的情况,
有一种解决方式是分桶,每个桶都是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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。