1. 程式人生 > >排序演算法Java實現——桶排序

排序演算法Java實現——桶排序

桶排序:

一、條件

桶排序不在是一種基於比較的排序方法,而是需要待排序列滿足以下兩個條件:

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),如果輸入資料非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。