中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java桶排序的基數排序怎么理解

發布時間:2021-12-06 10:13:10 來源:億速云 閱讀:95 作者:iii 欄目:開發技術

這篇文章主要介紹“Java桶排序的基數排序怎么理解”,在日常操作中,相信很多人在Java桶排序的基數排序怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java桶排序的基數排序怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

基數排序也是桶排序的一種,也是跟樣本數據強相關的,且基數排序要求樣本數據是非負的十進制數,如果有小數或者負數,那么代碼將要大量重寫!這就是不基于比較的排序的弊端。一般來說,我們認為基數排序時間復雜度為O(N)。但事實上,如果數據量很大很大,它的時間復雜度是O(N*log10(Max))(底數是10)。

基數排序算法流程不是很難,但是以下代碼實現方式比較騷,所以先放上一張截圖,方便查看。

Java桶排序的基數排序怎么理解

我們知道基數排序的實現流程是需要準備10個隊列的,但是經典的實現流程卻是利用了一個count數組來模擬了出隊列的操作,所以節省了空間。

package com.harrison.class05;
import java.util.Arrays;
// 基數排序也是桶排序的一種,也是跟樣本數據強相關的
// 且基數排序要求樣本數據是非負的十進制數
// 如果有小數或者負數,那么代碼將要大量重寫!
// 這就是不基于比較的排序的弊端
// 一般來說,我們認為基數排序時間復雜度為O(N)
// 但事實上,如果數據量很大很大,它的時間復雜度是O(N*log10(Max))(底數是10)
public class Code03_RadixSort {
	public static void radixSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		radixSort(arr, 0, arr.length - 1, maxBits(arr));
	}
	// 求出數組中最大值的位數
	// 比如數組中最大值是100 那么返回3
	public static int maxBits(int[] arr) {
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < arr.length; i++) {
			max = Math.max(max, arr[i]);
		}
		int res = 0;
		while (max != 0) {
			res++;
			max /= 10;
		}
		return res;
	}
	// 此方法配合截圖理解!!!
	public static void radixSort(int[] arr, int L, int R, int digit) {
		final int radix = 10;
		int i = 0, j = 0;
		// 原數組有多少個數,準備多少個空間
		int[] help = new int[R - L + 1];
		for (int d = 1; d <= digit; d++) {
			int[] count = new int[radix];
			for (i = L; i <= R; i++) {
				j = getDigits(arr[i], d);
				count[j]++;
			}
			for (i = 1; i < radix; i++) {
				count[i] = count[i] + count[i - 1];
			}
			for (i = R; i >= L; i--) {
				j = getDigits(arr[i], d);
				help[count[j] - 1] = arr[i];
				count[j]--;
			}
			for (i = 0, j = 0; i <= R; i++, j++) {
				arr[i] = help[i];
			}
		}
	}
	public static int getDigits(int x, int d) {
		return ((x / (int) (Math.pow(10, d - 1)))) % 10;
	}
	public static void comparator(int[] arr) {
		Arrays.sort(arr);
	}
	public static int[] generateRandomArray(int maxSize, int maxValue) {
		int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) ((maxValue + 1) * Math.random());
		}
		return arr;
	}
	public static int[] copyArray(int[] arr) {
		if (arr == null) {
			return null;
		}
		int[] res = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			res[i] = arr[i];
		}
		return res;
	}
	public static boolean isEqual(int[] arr1, int[] arr2) {
		if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
			return false;
		}
		if (arr1 == null && arr2 == null) {
			return true;
		}
		if (arr1.length != arr2.length) {
			return false;
		}
		for (int i = 0; i < arr1.length; i++) {
			if (arr1[i] != arr2[i]) {
				return false;
			}
		}
		return true;
	}
	public static void printArray(int[] arr) {
		if (arr == null) {
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		int testTime = 500000;
		int maxSize = 100;
		int maxValue = 100000;
		boolean succeed = true;
		for (int i = 0; i < testTime; i++) {
			int[] arr1 = generateRandomArray(maxSize, maxValue);
			int[] arr2 = copyArray(arr1);
			radixSort(arr1);
			comparator(arr2);
			if (!isEqual(arr1, arr2)) {
				succeed = false;
				printArray(arr1);
				printArray(arr2);
				break;
			}
		}
		System.out.println(succeed ? "Nice!" : "Fucking fucked!");
		int[] arr = generateRandomArray(maxSize, maxValue);
		printArray(arr);
		radixSort(arr);
		printArray(arr);
	}
}

到此,關于“Java桶排序的基數排序怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汶上县| 公安县| 浦城县| 资讯| 晋宁县| 楚雄市| 山丹县| 延庆县| 沽源县| 祁连县| 贺州市| 丰城市| 凌源市| 汾阳市| 宜宾市| 兰溪市| 石河子市| 渝中区| 金堂县| 宁国市| 南木林县| 临邑县| 长白| 郸城县| 东城区| 凭祥市| 北川| 伽师县| 花莲市| 辽源市| 黑河市| 上饶市| 平阴县| 永定县| 大洼县| 报价| 赞皇县| 石渠县| 胶南市| 砀山县| 铁岭市|