Java排序算法基數排序(桶排序)

概述

Java中排序算法是非常重要的一部分,這裏簡單分析下基數排序(桶排序)的實現思路及其代碼實現。

常見排序算法時間複雜度表

排序算法 平均時間複雜度 最差情形 穩定度 額外空間 備註
冒泡排序 O(n^2) O(n^2) 穩定 O(1) n小時較好
插入排序 O(n^2) O(n^2) 穩定 O(1) n小時較好
選擇排序 O(n^2) O(n^2) 不穩定 O(1) n小時較好
快速排序 O(nlogn) O(n^2) 不穩定 O(nlogn) n大時較好
希爾排序 O(nlogn) O(n^s)1 < s < 2 不穩定 O(1) n大時較好
歸併排序 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
堆排序 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
基數排序 O(nlogn) OlogrB O(n) O(n) B爲真數(0-9),r爲基數個十百

基數排序(桶排序)介紹

基數排序(radix sort)屬於分配式排序,又稱爲桶排序。顧名思義,它是通過鍵值的各個位數的值將要排序的元素分配至某些桶中,達到排序的作用。
基數排序屬於穩定性的排序,基數排序是一個效率高的穩定性排序法
基數排序是(Radix sort)是桶排序的擴展

基數排序的基本思想

  1. 將所有待比較數值統一爲同樣位數長度,位數較短的數前面補零。然後從最低位開始,依次進行排序。一直從最低位排到最高位後,數列便成爲了一個有序的數列了。

基數排序圖解

基數排序圖解

基數排序代碼實現(本代碼僅支持正整數)

public class RadixSort {

	/**
	* @param arr 待尋找的數組
	* @return 數組中最大位數的長度
	*/
	public static int findMax(int[] arr) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		int max = arr[0];
		for (int i = 1;i < arr.length;i++) {
			if (max < arr[i]) {
				max = arr[i];
			}
		}
		int maxLength = ("" + max).length();
		return maxLength;
	}

	/**
	* 進行桶排序
	* @param arr 待排序的數組
	* @param 數組中最大數的位數
	*/
	public static void radixSort(int[] arr, int maxLength) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		// 創建10個桶,分別記錄數值爲(0 - 9)
		int[][] bucket = new int[10][arr.length];
		
		// 創建10個數組用來記錄每個桶中元素的個數
		int[] bucketElementCounts = new int[10];
		for (int i = 0,n = 1;i < maxLength;i++,n *= 10) {
			for (int j = 0;j < arr.length;i++) {
				int digitOfElement= arr[i] / n % 10;
				bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
				bucketElementCounts[digitOfElement] ++;
			}
			
			int index = 0;
			for (int i = 0;i < bucketElementCounts.length;i++) {
				if (bucketElementCounts[i] > 0) {
					for (int j = 0; j < bucketElementCounts[i];j++) {
						arr[index] = bucket[i][j];
						index++;
					}
					bucketElementCounts[i] = 0;
				}
			}
		}
	}
}

代碼寫完,小弟能力有限,僅供參考!!!如有錯誤歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章