排序演算法Java實現——桶排序
阿新 • • 發佈:2018-12-30
桶排序:
一、條件
桶排序不在是一種基於比較的排序方法,而是需要待排序列滿足以下兩個條件:
1)待排序列的值處於一個可列舉的範圍內
2)待排序列所在可列舉範圍不應太大,不然開銷會很大。
二、場景
桶排序(Bucket Sort)的原理很簡單,它是將陣列分到有限數量的桶子裡。
假設待排序的陣列a中共有N個整數,並且已知陣列a中資料的範圍[0, MAX)。在桶排序時,建立容量為MAX的桶陣列r,並將桶陣列元素都初始化為0;將容量為MAX的桶陣列中的每一個單元都看作一個"桶"。
在排序時,逐個遍歷陣列a,將陣列a的值,作為"桶陣列r"的下標。當a中資料被讀取時,就將桶的值加1。例如,讀取到陣列a[3]=5,則將r[5]的值+1。
三、程式碼
/*@(#)bucketSort.java 2017-4-27
* Copy Right 2017 Bank of Communications Co.Ltd.
* All Copyright Reserved
*/
package com.sort.cn;
/**
* TODO Document bucketSort
* <p>
* @version 1.0.0,2017-4-27
* @author Singit
* @since 1.0.0
*/
public class bucketSort {
public static void main(String[] args) {
int[] x = { 98, 65, 25, 44, 50, 20 ,110, 50};
int[] sorted = bucketSort(x, 9999);
for (int i = 0; i < sorted.length; i++)
{
if (sorted[i] > 0)
System.out.print(sorted[i]+" ");
}
}
public static int[] bucketSort(int[] nums, int maxNum){
int[] sorted = new int[maxNum+1];
for(int i=0; i<nums.length; i++){
sorted[nums[i]] = nums[i];//把資料放到對應索引的位置
}
return sorted;
}
}
輸出結果:
20 25 44 50 65 98 110
總結:
桶排序的平均時間複雜度為線性的O(N+C),其中C=N*(logN-logM)。
如果相對於同樣的N,桶數量M越大,其效率越高,最好的時間複雜度達到O(N)。
當然桶排序的空間複雜度 為O(N+M),如果輸入資料非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。