zoukankan      html  css  js  c++  java
  • 经典算法之排序问题(二):桶排序、鸽巢排序

    鸽巢排序:

    鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(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("
    ");
    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

  • 相关阅读:
    自定义全局样式
    ionic错误
    ionic 创建某个文件下的page
    获取高度
    页面加载完成
    css中有些属性的前面会加上“*”或“_(兼容IE浏览器)
    【Visual Studio】error C2220: 警告被视为错误
    H264格式(转)
    什么是信令?什么是信令网?(转)
    XMPP协议实现原理介绍(转)
  • 原文地址:https://www.cnblogs.com/sunrunzhi/p/3983419.html
Copyright © 2011-2022 走看看