Java桶排序的基数排序怎么理解
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要介绍"Java桶排序的基数排序怎么理解",在日常操作中,相信很多人在Java桶排序的基数排序怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java桶
千家信息网最后更新 2025年02月05日Java桶排序的基数排序怎么理解
这篇文章主要介绍"Java桶排序的基数排序怎么理解",在日常操作中,相信很多人在Java桶排序的基数排序怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java桶排序的基数排序怎么理解"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
基数排序也是桶排序的一种,也是跟样本数据强相关的,且基数排序要求样本数据是非负的十进制数,如果有小数或者负数,那么代码将要大量重写!这就是不基于比较的排序的弊端。一般来说,我们认为基数排序时间复杂度为O(N)。但事实上,如果数据量很大很大,它的时间复杂度是O(N*log10(Max))(
底数是10)。
基数排序算法流程不是很难,但是以下代码实现方式比较骚,所以先放上一张截图,方便查看。
我们知道基数排序的实现流程是需要准备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桶排序的基数排序怎么理解"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
排序
基数
数据
复杂
很大
复杂度
数组
时间
样本
学习
代码
流程
最大
一般来说
事实
事实上
十进制
小数
就是
底数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天津国家网络安全员招聘
厦门保力网络技术有限公司
河南恒山系列鲲鹏服务器直销价格
软件开发排期
建行武汉软件开发中心
宽城区网络技术服务哪家好
我的世界没有管理的服务器推荐
网络安全态势的平稳
win7服务器管理界面
通用网络安全技术论文
石壕吏翻译软件开发
数据库设计tinyint
北邮的网络安全空间研究生考哪些
网络安全抓落实
台州官方软件开发哪家好
榆林天气预报软件开发
数据库表最多存多少数据
湖南新一代软件开发服务价钱
无法运行服务器管理器
零信任网络安全平台
武强租房软件开发
网络安全第1条
服务器配置与管理如何新建目录
gene数据库怎么找
专技天下网络安全
实况2021手游数据库下载
原神怎么下载两个服务器
万方数据库论文查重报告
工信数据企业信用数据库
伤害世界怎么加入服务器