桶排序之基数排序

简介: 桶排序之基数排序

基数排序也是桶排序的一种,也是跟样本数据强相关的,且基数排序要求样本数据是非负的十进制数,如果有小数或者负数,那么代码将要大量重写!这就是不基于比较的排序的弊端。一般来说,我们认为基数排序时间复杂度为O(N)。但事实上,如果数据量很大很大,它的时间复杂度是O(N*log10(Max))(底数是10)。

基数排序算法流程不是很难,但是以下代码实现方式比较骚,所以先放上一张截图,方便查看。image.png

我们知道基数排序的实现流程是需要准备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);
  }
}
相关文章
|
网络协议 应用服务中间件 网络安全
如何排查Nginx配置问题导致的域名访问错误
如何排查Nginx配置问题导致的域名访问错误
1626 2
|
达摩院 API C++
MindOpt--C++语言-对一个简单的混合整数规划问题建模求解
MindOpt是达摩院决策智能实验室研究的一款优化求解器,目前在优化求解线性规划问题这一功能上取得不错的成绩,希望大家能够帮我们多多打磨其他功能(混合整数线性规划、二次规划、半定规划目前都在公测),让我们的MindOpt在优化求解器这板块成为国产之光。
MindOpt--C++语言-对一个简单的混合整数规划问题建模求解
|
2天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
6天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
9天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
3天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
303 192
|
3天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
357 167
|
2天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
305 2