桶排序

桶排序的原理是:將數組分到有限數量的桶子裏。每一個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種概括結果。當要被排序的數組內的數值是均勻分配的時候,桶排序使用線性時間(Θ(n))。但桶排序並非 比較排序,他不受到 O(n log n) 下限的影響。主要原理是:利用了空間換時間的方法。java

因此,桶排序的複雜度依賴於兩部分: 
(1) 循環計算每一個關鍵字的桶映射函數,這個時間複雜度是O(N)。 
(2) 利用先進的比較排序算法對每一個桶內的全部數據進行排序,其時間複雜度爲 ∑ O(Ni*logNi) 。其中Ni 爲第i個桶的數據量。算法

總結: 桶排序的平均時間複雜度爲線性的O(N+C),其中C=N*(logN-logM)。若是相對於一樣的N,桶數量M越大,其效率越高,最好的時間複雜度達到O(N)。 固然桶排序的空間複雜度 爲O(N+M),若是輸入數據很是龐大,而桶的數量也很是多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。數組

下面給出桶排序的Java實現代碼:dom

package bucketsort; //桶排序:將N個數,分紅m個桶,桶之間的元素遞增,而後對桶內的元素進行排序,最後輸出全部元素 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; /** * @author Gavenyeah * @date Time: 2016年4月20日下午10:12:43 * @des: */ public class BucketSort { int bucketSize = 10; int arraySize = 10000; public static void main(String[] args) { BucketSort bs = new BucketSort(); int[] array = bs.getArray(); bs.bucketSort(array); } public int[] getArray() { int[] arr = new int[arraySize / 3]; Random r = new Random(); for (int i = 0; i < arraySize; i++) { arr[i] = r.nextInt(100000); } return arr; } public void bucketSort(int[] a) { @SuppressWarnings("unchecked") List<Integer> bucket[] = new ArrayList[bucketSize]; for (int i = 0; i < a.length; i++) { int temp = a[i] / 10000; if (bucket[temp] == null) { bucket[temp] = new ArrayList<Integer>(); } bucket[temp].add(a[i]); } // 對各個桶內的list中的元素進行排序 for (int j = 0; j < bucketSize; j++) { insertSort(bucket[j]);// 對桶內的元素進行排序 printList(bucket[j]);// 輸出桶中的元素 } } public void printList(List<Integer> list) { while (list.size() > 0) { System.out.print(list.remove(0) + "\t"); } } public void insertSort(List<Integer> list) {// 對每一個list進行排序 Collections.sort(list); } }
相關文章
相關標籤/搜索