Java桶排序之基数排序详解
作者:爱敲代码的Harrison 发布时间:2021-08-26 13:38:58
标签: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);
}
}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/weixin_44337241/article/details/121716513


猜你喜欢
- 本文实例讲述了Java爬取豆瓣电影数据的方法。分享给大家供大家参考,具体如下:所用到的技术有Jsoup,HttpClient。Jsoupjs
- 本文实例讲述了Java比较两个List的值是否相等的方法。分享给大家供大家参考。具体如下:假设两个队列 {1,2,3,4} 和 {4,3,2
- 主要通过System.Resources.ResourceManager类中GetString和GetObject两个方法。两个方法的返回值
- MyBatis框架提供了二级缓存接口,我们只需要实现它再开启配置就可以使用了。特别注意,我们要解决缓存穿透、缓存穿透和缓存雪崩的问题,同时也
- 前言短信信息的发送目前已经是项目中必不可少的部分,我们怎么通过web页面来实现把信息推送到别人手机上呢?简单点,编码的方式简单点!看完本篇文
- 1.创建列表(列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建的这个列表要存储什么类型的)(泛型)//创建列表  
- 本文实例讲述了C#使用Socket实现发送和接收图片的方法。分享给大家供大家参考。具体如下:using System;using Syste
- eclipse 创建 user library 方法1、Window - Preferences - Java - Build Path -
- Java类加载基本过程详细介绍基本过程:根据类的全限定名称加载定义类的二进制字节流。将字节流代表的静态存储结构转化为方法区的运行时数据结构内
- 为大家分享的解决MyEclipse中的Building workspace问题的方法如下方法一:点击“Project”,取消勾选“Build
- 自动编辑文本框(AutoCompleteTextView)继承自EditText,能够接受用户的输入编辑,但是有这自己的特色功能:输入一定的
- 一、引入先给出一个Num类的定义internal class Num{ public static int odd = 5000
- java里有数字long来表示大的整数,如果两个数字的范围超过了long,要做加法算法怎么做呢?这个问题在面试中经常碰到,如果之前没有经历的
- ViewDragHelper是support.v4下提供的用于处理拖拽滑动的辅助类,查看Android的DrawerLayout源码,可以发
- 一、题目描述题目实现:不同的客户端之间需要进行通信,一个客户端与指定的另一客户端进行通信,实现一对一聊天功能。实现一个客户端与指定的另一客户
- 简介工厂方法模式是什么?为什么要有工厂方法模式,不是有了简单工厂模式了吗?两个模式都有工厂,那有什么不同呢?功工厂方式模式是怎样实现的?OK
- 这是一个高级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。接下来
- 前言Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util
- 本文实例讲述了Android编程实现仿QQ发表说说,上传照片及弹出框效果。分享给大家供大家参考,具体如下:代码很简单,主要就是几个动画而已,
- 下面就为大家带来3种比较常见的压缩方式先给出一组数据原图:width:2976; height:2976原图实际:--->byte:2