算法导论学习笔记——桶排序

[java]  view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3. /** 
  4.  * 桶排序:桶排序的思想是把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去。 
  5.  * 因为输入数均匀且独立分布在[0,1)上,所以,一般不会有很多数落在一个桶中的情况。 
  6.  * 为了得到结果,先对各个桶中的数进行排序,然后按次序把各桶中的元素列出来。 
  7.  * 桶排序的时间复杂度为O(n) 
  8.  */  
  9. public class BucketSort {  
  10.   
  11.     /** 
  12.      * 桶排序算法,对arr进行桶排序,排序结果仍放在arr中 
  13.      * @param arr 
  14.      */  
  15.     static void bucketSort(double arr[]){  
  16.         int n = arr.length;  
  17.         ArrayList arrList[] = new ArrayList [n];  
  18.         //把arr中的数均匀的的分布到[0,1)上,每个桶是一个list,存放落在此桶上的元素  
  19.         for(int i =0;i<n;i++){  
  20.             int temp = (int) Math.floor(n*arr[i]);  
  21.             if(null==arrList[temp])  
  22.                 arrList[temp] = new ArrayList();  
  23.             arrList[temp].add(arr[i]);            
  24.         }  
  25.         //对每个桶中的数进行插入排序  
  26.         for(int i = 0;i<n;i++){  
  27.             if(null!=arrList[i])  
  28.                 insert(arrList[i]);  
  29.         }  
  30.         //把各个桶的排序结果合并  
  31.         int count = 0;  
  32.         for(int i = 0;i<n;i++){  
  33.             if(null!=arrList[i]){  
  34.                 Iterator iter = arrList[i].iterator();  
  35.                 while(iter.hasNext()){  
  36.                     Double d = (Double)iter.next();  
  37.                     arr[count] = d;  
  38.                     count++;  
  39.                 }  
  40.             }  
  41.         }  
  42.     }  
  43.     /** 
  44.      * 用插入排序对每个桶进行排序 
  45.      * @param list 
  46.      */  
  47.     static void insert(ArrayList list){  
  48.         if(list.size()>1){  
  49.             for(int i =1;i<list.size();i++){  
  50.                 if((Double)list.get(i)<(Double)list.get(i-1)){  
  51.                     double temp = (Double) list.get(i);  
  52.                     int j = i-1;  
  53.                     for(;j>=0&&((Double)list.get(j)>(Double)list.get(j+1));j--)  
  54.                         list.set(j+1, list.get(j));  
  55.                     list.set(j+1, temp);  
  56.                 }  
  57.             }  
  58.         }  
  59.     }  
  60.     /** 
  61.      * 测试..... 
  62.      * 这里的测试数据是一个含n个元素的数组,且每个元素满足0<=arr[i]<1 
  63.      */  
  64.     public static void main(String[] args) {  
  65.         double arr[] = {0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68};  
  66.         bucketSort(arr);  
  67.         for(int i = 0;i<arr.length;i++)  
  68.             System.out.println(arr[i]);  
  69.     }  
  70. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值