经典算法之排序问题(二):桶排序、鸽巢排序

鸽巢排序:

鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用.
当涉及到多个不相等的元素, 且将这些元素放在同一个"鸽巢"的时候, 算法的效率会有所降低.为了简便和保持鸽巢排序在适应不同的情况, 比如两个在同一个存储桶中结束的元素必然相等
我们一般很少使用鸽巢排序, 因为它很少可以在灵活性, 简便性, 尤是速度上超过其他排序算法. 事实上, 桶排序较鸽巢排序更加的实用.
 
 1 package offer;
 2 
 3 
 4 public class BucketSort {
 5     
 6     static void bucketsort(int data[],int min,int max)
 7     {
 8         int bucksize=max-min+1;
 9         int bucket[]=new int[bucksize];
10         int datalength=data.length;
11          //打印数组
12         System.out.println("排序之前:");
13         for(int i=0;i<datalength;i++)
14             System.out.print(data[i]+" ");
15         System.out.println("\n");
16         //确立每个元素的个数
17         for(int i=0;i<datalength;i++)
18                bucket[data[i]-min]++;
19         //开始排序(实现一)
20 //        for(int i=0,j=0;i<bucksize;)
21 //        {
22 //            if(bucket[i]>0)
23 //            {
24 //                data[j]=i+min;
25 //                j++;
26 //                bucket[i]--;
27 //            }
28 //            else ++i;
29 //        }
30         //实现二
31         int j=0;
32         for(int i=0;i<bucksize;i++)
33             for(int k=0;k<bucket[i];++k)
34                 data[j++]=i+min;
35                 
36         //打印数组
37         System.out.println("排序之后:");
38         for(int i=0;i<datalength;i++)
39             System.out.print(data[i]+" ");
40         
41     }
42     public static void main(String[] args)
43     {
44         int data[]={1,2,-2,3,4,1,3,-2,3,-3,-2,1,3,3,4};
45         bucketsort(data,-3,4);
46     }
47 
48 }

 

 
桶排序:
假定:输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…将n个输入元素分配到这些桶中,对桶中元素进行排序,然后依次连接桶输入0 ≤A[1..n] <1辅助数组B[0..n-1]是一指针数组,指向桶(链表)。
 
此处介绍桶排序算法以及应用:http://hxraid.iteye.com/blog/647759
 1 package offer;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.LinkedList;
 6 import java.util.List;
 7 
 8 public class BucketSort2 {
 9     
10     static void sort(int data[],int bucksize)
11     {
12         int n = data.length;  
13         ArrayList arrList[] = new ArrayList [n];  
14         //入桶存放
15         for(int i =0;i<n;i++){  
16             int temp = data[i]/10;
17             if(null==arrList[temp])  
18                 arrList[temp] = new ArrayList();  
19             arrList[temp].add(data[i]);            
20         }  
21         //对每个桶中的数进行插入排序  
22         for(int i = 0;i<n;i++){  
23             if(null!=arrList[i])  
24                 insert(arrList[i]);  
25         }  
26         //把各个桶的排序结果合并  
27         int count = 0;  
28         for(int i = 0;i<n;i++){  
29             if(null!=arrList[i]){  
30                 Iterator iter = arrList[i].iterator();  
31                 while(iter.hasNext()){  
32                     Integer d = (Integer)iter.next();  
33                     data[count] = d;  
34                     count++;  
35                 }  
36             }  
37         }
38         
39         //打印输出
40         for(int i=0;i<n;i++)
41             System.out.print(data[i]+" ");
42     }  
43    /*
44     * 对桶内部排序
45     */
46     static void insert(ArrayList list)
47     {
48         if(list.size()>1){  
49             for(int i =1;i<list.size();i++){  
50                 if((Integer)list.get(i)<(Integer)list.get(i-1))
51                 {  
52                     int temp = (Integer) list.get(i);  
53                     int j = i-1;  
54                     for(;j>=0&&((Integer)list.get(j)>(Integer)list.get(j+1));j--)  
55                         list.set(j+1, list.get(j));  
56                     list.set(j+1, temp);  
57                 }  
58             }  
59         }         
60     }
61         
62     public static void main(String[] args)
63     {
64         int data[]={23,12,33,56,77,88,98,74,54,68,89,96,34,63};
65         sort(data,10);
66     }
67 }

代码参考博文:http://blog.csdn.net/fg2006/article/details/6677465

posted @ 2014-09-20 16:24  Mars、少年  阅读(823)  评论(0编辑  收藏  举报