import java.util.ArrayList;import java.util.Iterator;/** * 桶排序:桶排序的思想是把區間[0,1)劃分成n個相同大小的子區間,稱為桶,然後將n個輸入數分布到各個桶中去。 * 因為輸入數均勻且獨立分布在[0,1)上,所以,一般不會有很多數落在一個桶中的情況。 * 為了得到結果,先對各個桶中的數進行排序,然後按次序把各桶中的元素列出來。 * 桶排序的時間複雜度為O(n) */public class BucketSort {/** * 桶排序演算法,對arr進行桶排序,排序結果仍放在arr中 * @param arr */static void bucketSort(double arr[]){int n = arr.length;ArrayList arrList[] = new ArrayList [n];//把arr中的數均勻的的分布到[0,1)上,每個桶是一個list,存放落在此桶上的元素for(int i =0;i<n;i++){int temp = (int) Math.floor(n*arr[i]);if(null==arrList[temp])arrList[temp] = new ArrayList();arrList[temp].add(arr[i]);}//對每個桶中的數進行插入排序for(int i = 0;i<n;i++){if(null!=arrList[i])insert(arrList[i]);}//把各個桶的排序結果合并int count = 0;for(int i = 0;i<n;i++){if(null!=arrList[i]){Iterator iter = arrList[i].iterator();while(iter.hasNext()){Double d = (Double)iter.next();arr[count] = d;count++;}}}}/** * 用插入排序對每個桶進行排序 * @param list */static void insert(ArrayList list){if(list.size()>1){for(int i =1;i<list.size();i++){if((Double)list.get(i)<(Double)list.get(i-1)){double temp = (Double) list.get(i);int j = i-1;for(;j>=0&&((Double)list.get(j)>(Double)list.get(j+1));j--)list.set(j+1, list.get(j));list.set(j+1, temp);}}}}/** * 測試..... * 這裡的測試資料是一個含n個元素的數組,且每個元素滿足0<=arr[i]<1 */public static void main(String[] args) {double arr[] = {0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68};bucketSort(arr);for(int i = 0;i<arr.length;i++)System.out.println(arr[i]);}}