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

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

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

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

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

在這里插入圖片描述

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

package com.harrison.class05;
import java.util.Arrays;
// 基數(shù)排序也是桶排序的一種,也是跟樣本數(shù)據(jù)強相關(guān)的
// 且基數(shù)排序要求樣本數(shù)據(jù)是非負(fù)的十進制數(shù)
// 如果有小數(shù)或者負(fù)數(shù),那么代碼將要大量重寫!
// 這就是不基于比較的排序的弊端
// 一般來說,我們認(rèn)為基數(shù)排序時間復(fù)雜度為O(N)
// 但事實上,如果數(shù)據(jù)量很大很大,它的時間復(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ù)組有多少個數(shù),準(zhǔn)備多少個空間
		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實現(xiàn)對象存儲的示例詳解

    SpringBoot+MinIO實現(xiàn)對象存儲的示例詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    SpringBoot中各種Controller的寫法

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

    java hasNext()使用實例解析

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

最新評論

潞城市| 梅州市| 客服| 芜湖县| 岗巴县| 昌吉市| 文成县| 贵阳市| 陕西省| 新疆| 和顺县| 新沂市| 古蔺县| 黎川县| 扬中市| 黄浦区| 青浦区| 神木县| 贵阳市| 吉林省| 蓝田县| 应城市| 固原市| 龙门县| 环江| 岳阳县| 化德县| 米易县| 龙井市| 买车| 永济市| 颍上县| 蓬安县| 康保县| 黄山市| 仙游县| 阳江市| 乌兰县| 万全县| 彩票| 库伦旗|