最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java桶排序之基數(shù)排序詳解

 更新時(shí)間:2021年12月05日 16:41:50   作者:愛敲代碼的Harrison  
這篇文章主要為大家介紹了Java桶排序之基數(shù)排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

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

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

在這里插入圖片描述

我們知道基數(shù)排序的實(shí)現(xiàn)流程是需要準(zhǔn)備10個(gè)隊(duì)列的,但是經(jīng)典的實(shí)現(xiàn)流程卻是利用了一個(gè)count數(shù)組來模擬了出隊(duì)列的操作,所以節(jié)省了空間。

package com.harrison.class05;
import java.util.Arrays;
// 基數(shù)排序也是桶排序的一種,也是跟樣本數(shù)據(jù)強(qiáng)相關(guān)的
// 且基數(shù)排序要求樣本數(shù)據(jù)是非負(fù)的十進(jìn)制數(shù)
// 如果有小數(shù)或者負(fù)數(shù),那么代碼將要大量重寫!
// 這就是不基于比較的排序的弊端
// 一般來說,我們認(rèn)為基數(shù)排序時(shí)間復(fù)雜度為O(N)
// 但事實(shí)上,如果數(shù)據(jù)量很大很大,它的時(shí)間復(fù)雜度是O(N*log10(Max))(底數(shù)是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));
	}
	// 求出數(shù)組中最大值的位數(shù)
	// 比如數(shù)組中最大值是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;
		// 原數(shù)組有多少個(gè)數(shù),準(zhǔn)備多少個(gè)空間
		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);
	}
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    MinIO?是一個(gè)基于Apache?License?v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù),它是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,所以下面我們就來看看SpringBoot如何整合MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)吧
    2023-10-10
  • java使用數(shù)組和鏈表實(shí)現(xiàn)隊(duì)列示例

    java使用數(shù)組和鏈表實(shí)現(xiàn)隊(duì)列示例

    隊(duì)列是一種特殊的線性表,它只允許在表的前端(front)進(jìn)行刪除操作,只允許在表的后端(rear)進(jìn)行插入操作,下面介紹一下java使用數(shù)組和鏈表實(shí)現(xiàn)隊(duì)列的示例
    2014-01-01
  • 運(yùn)用Spring?Aop+注解實(shí)現(xiàn)日志記錄

    運(yùn)用Spring?Aop+注解實(shí)現(xiàn)日志記錄

    我們都知道Spring框架的兩大特性分別是 IOC (控制反轉(zhuǎn))和 AOP (面向切面),這個(gè)是每一個(gè)Spring學(xué)習(xí)視頻里面一開始都會(huì)提到的,這里,如果我們使用Aop來記錄日志,那是再好不過了,感興趣的朋友跟隨小編一起學(xué)習(xí)下Spring?Aop注解實(shí)現(xiàn)日志記錄的過程吧
    2022-01-01
  • fastjson全局日期序列化設(shè)置導(dǎo)致JSONField失效問題解決方案

    fastjson全局日期序列化設(shè)置導(dǎo)致JSONField失效問題解決方案

    這篇文章主要介紹了fastjson通過代碼指定全局序列化返回時(shí)間格式,導(dǎo)致使用JSONField注解標(biāo)注屬性的特殊日期返回格式失效問題的解決方案
    2023-01-01
  • java設(shè)計(jì)模式之觀察者模式

    java設(shè)計(jì)模式之觀察者模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之觀察者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • mybatisplus添加真正的批量新增、批量更新的實(shí)現(xiàn)

    mybatisplus添加真正的批量新增、批量更新的實(shí)現(xiàn)

    這篇文章主要介紹了mybatisplus添加真正的批量新增、批量更新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • idea修改maven模塊名稱還顯示老名稱問題解決

    idea修改maven模塊名稱還顯示老名稱問題解決

    本文主要介紹了idea修改maven模塊名稱還顯示老名稱問題解決,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Java SE求解漢諾塔問題的示例代碼

    Java SE求解漢諾塔問題的示例代碼

    漢諾塔問題是一個(gè)經(jīng)典的問題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說。本文將用Java SE求解這一問題,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • SpringBoot中各種Controller的寫法

    SpringBoot中各種Controller的寫法

    這篇文章主要介紹了SpringBoot中各種Controller的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java hasNext()使用實(shí)例解析

    java hasNext()使用實(shí)例解析

    這篇文章主要介紹了java hasNext()使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

建宁县| 古交市| 安顺市| 杂多县| 桂平市| 登封市| 岳池县| 泸西县| 新乡县| 勃利县| 济阳县| 弥渡县| 华池县| 屯昌县| 株洲县| 张家界市| 临猗县| 郯城县| 武穴市| 达拉特旗| 通州区| 淮阳县| 桑植县| 栾城县| 静乐县| 讷河市| 宁海县| 鹿邑县| 商丘市| 五华县| 汕尾市| 德州市| 中阳县| 阿克陶县| 山阳县| 利辛县| 邯郸市| 安国市| 阿拉尔市| 都昌县| 邹城市|