当前位置: 首页 > news >正文

不基于比较的排序:基数排序

本篇只是讨论桶排序的具体实现,想了解更多算法内容可以在我的博客里搜,建议大家看看这篇排序算法总结:排序算法总结_鱼跃鹰飞的博客-CSDN博客

 桶排序的原理:

代码:sort1是一个比较二逼的实现方式浪费空间,sort2是一个正式的方法 

package sort;import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;public class RadixSort {public static void radixSort(int[] arr) {int maxBit = getMaxBit(arr);sort2(arr, 0, arr.length - 1, maxBit);}/*** 具体的基数排序过程* @param arr 排序原始数组* @param start 要排序范围开始下标* @param end 要排序范围结束下标* @param maxBit*/public static void sort(int[] arr, int start, int end, int maxBit) {final int bucketSize = 10;//先copy一份数据,注意这里的第三个参数要+1,因为是左闭右开int[] copy = Arrays.copyOfRange(arr, start, end+1);//创建一个Queue数组,长度为10作为桶Queue<Integer>[] queues = new LinkedList[bucketSize];for(int i = 0; i < bucketSize; i++) {queues[i] = new LinkedList();}for(int digit = 0; digit < maxBit; digit ++) {for(int i = start; i <= end; i ++) {int bucketNum = digit == 0? copy[i]%10 : (copy[i]/(digit*10))%10;//如果是个位的话,直接模10,10位的话,除以digit*10。。。digit*100queues[bucketNum].offer(copy[i]);}//每一次把所有的数放完之后,从桶中倒出,先进去先倒出来(队列实现)int curIndex = 0;for (int i = start; i <= end; i++) {//从0到9挨个取出每个桶里的数据,依次放入copy数组中//这就是从桶里倒数据的过程for (Queue<Integer> queue : queues) {while (!queue.isEmpty()) {copy[curIndex ++]  = queue.poll();}}}}//把排完序的数组复制到原来的数组,如果这个方法是有返回值的,也可以直接返回copyfor(int i = 0; i < copy.length;i++) {arr[i] = copy[i];}}/*** 基数排序的省空间的解法* @param arr 原始数组* @param start 开始下标* @param end 结束下标* @param maxDigit*/public static void sort2(int[] arr, int start, int end, int maxDigit) {final int radixCount = 10;//创建一个辅助数组用于中间过程的转换,长度为区间长度int[] help = new int[end - start + 1];//如果最高位是maxDigit,那从0到maxDigit-1依次进行每一轮的入桶和出桶过程for(int digit = 0; digit < maxDigit; digit ++) {//统计数组,作为桶使用int[] countArr = new int[radixCount];//每一轮的入桶操作,countArr[i]代表当前位是i的有多少个数for(int i = start; i <= end; i++) {int digitNum = getDigitNum(arr[i], digit);countArr[digitNum] ++;}//把countArr改造为前缀和//这个循环结束了countArr[i]代表当前位小于等于i的有多少个(i这个数最后的下标是countArr[i]-1)for(int i = 0; i < countArr.length; i++) {countArr[i] = i == 0? countArr[i] : countArr[i] + countArr[i-1];}//根据前缀和数组计算当前数字要放的位置for(int i = help.length - 1; i >= 0; i --) {//取当前位的数int digitNum = getDigitNum(arr[i], digit);//辅助数组中的countArr[i]代表当前位小于等于i的有多少个,那等于i的最后一个数应该放置在countArr[i]-1位置//放完之后等于i的最后没有放元素的还有countArr[i]-1个help[--countArr[digitNum]] = arr[i];}//每一轮拷贝回原数组,方便下次循环用for(int i = start; i < end;i++) {arr[i] = help[i];}}}public static int getDigitNum(int num, int digit) {if(digit == 0) return num % 10;if(num < Math.pow(10, digit)) {return 0;}int digitNum = num;while(digit > 0) {digitNum = (digitNum / 10);digit --;}return digitNum%10;}public static int getMaxBit(int[] arr) {int maxBit = 0;for(int i = 0; i < arr.length; i++) {int curBit = 0;int val = arr[i];while(val != 0) {curBit ++;val = val/10;}maxBit = Math.max(maxBit, curBit);}return maxBit;}//判断两个数组每个位置的数是否相等public static boolean isEqualsArray(int[] arr1, int[] arr2) {if((arr1 == null && arr2 == null) || (arr1 == arr2)) return true;if(arr1 == null || arr2 == null || 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 main(String[] args) {int[] arr = {103, 9, 13, 17, 25, 27};int[] arr2 = {103, 9, 13, 17, 25, 27};int maxBit = getMaxBit(arr);System.out.println(maxBit);boolean isEquals = isEqualsArray(arr, arr2);System.out.println(isEquals);radixSort(arr);printArr(arr);/*int digitNum = getDigitNum(3020,1);System.out.println(digitNum);*/}public static void printArr(int[] arr) {for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

相关文章:

不基于比较的排序:基数排序

本篇只是讨论桶排序的具体实现&#xff0c;想了解更多算法内容可以在我的博客里搜&#xff0c;建议大家看看这篇排序算法总结&#xff1a;排序算法总结_鱼跃鹰飞的博客-CSDN博客 桶排序的原理&#xff1a; 代码&#xff1a;sort1是一个比较二逼的实现方式浪费空间&#xff0c;s…...

shell和反弹shell

文章目录 是什么&#xff1f;bash是什么&#xff1f;反弹shell 是什么&#xff1f; Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了…...

构建Docker容器监控系统(Cadvisor +Prometheus+Grafana)

Cadvisor PrometheusGrafana 1.1、Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 1.2、安装docker-ce [rootloc…...

java实现文件的下载

系统日志的获取不可能每次都登录服务器&#xff0c;所以在页面上能够下载系统运行的日志是必须的 如何来实现日志的下载&#xff0c;这样的一个功能 前端我们用到的是window.open(...)这样可以发送一个get请求到后台 后台接收到get请求之后&#xff0c;如何实现对文件的下载 R…...

分享Python技术下AutojsPro7云控代码

引言 有图有真相&#xff0c;那短视频就更是真相了。下面是三大语言的短视频。 Java源码版云控示例&#xff1a; Java源码版云控示例在线视频 Net源码版云控示例&#xff1a; Net源码版云控示例在线视频亚丁号-知识付费平台 支付后可见 扫码付费可见 Python源码版云控示例…...

【Linux】网络通信

【Linux】网络通信 文章目录 【Linux】网络通信1、网络基础1.1 计算机网络1.2 网络模型TCP & UDP1&#xff09;IP地址2&#xff09;端口3&#xff09;TCP协议与UDP协议的比较 1.3 网络传输1.3.1 传输逻辑1.3.2 传输条件1.3.3 传输流程 1.4 地址管理 2、网络编程2.1 基本概念…...

【mysql】—— 表的约束

目录 序言 &#xff08;一&#xff09;空属性 &#xff08;二&#xff09;默认值 &#xff08;三&#xff09;列描述 &#xff08;四&#xff09;zerofill &#xff08;五&#xff09;主键 &#xff08;六&#xff09;自增长 &#xff08;七&#xff09;唯一键 &#…...

jeecgboot 登录成功默认其他路由

util.js...

【1572. 矩阵对角线元素的和】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3]…...

GaussDB 开发篇+Java调用JDBC访问openGauss数据库

★ 数据库信息 ✔ 数据库版本&#xff1a;openGauss 5.0.0 ✔ 数据库端口&#xff1a;5432 ✔ 数据库名称&#xff1a;db_zzt ★ Java代码 package PAC_001;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sq…...

钕铁硼永磁材料基本概念

目录 一、何为磁性材料二、永磁材料的主要性能三、永磁材料的历史四、永磁材料的分类五、钕铁硼永磁材料5.1 产业链5.2 生产工艺 之前也写过其他行业的一些生产过程和工艺流程&#xff0c;大家有兴趣的可以翻翻以前的文章。 一、何为磁性材料 参加过九年义务教育的同学应该都知…...

2005-2020年280个地级市绿色全要素生产率测算原始数据

2005-2020年280个地级市绿色全要素生产率测算原始数据 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;中国城市统计年鉴、中国区域统计年鉴、中国能源年鉴、中国环境年鉴等 3、范围&#xff1a;280个地级市 4、指标&#xff1a;年末单位从业人员数、规模以上工业企业…...

电流的测量(反馈电流表)

另一方面&#xff0c;反馈电流表使用不同的方法来产生电流测量&#xff08;见图 3&#xff09;。他们使用有源跨阻放大器将电流转换为电压读数。电压输出是电流输入的倒数乘以反馈电阻器 R F的值。 V输出 -I输入* R F 图 3. 反馈电流表方法使用有源跨阻放大器将电流转换为…...

白帽黑帽与linux安全操作

目录 白帽黑帽 Linux安全 白帽黑帽 白帽&#xff08;White Hat&#xff09;和黑帽&#xff08;Black Hat&#xff09;通常用于描述计算机安全领域中的两种不同角色。白帽黑客通常被认为是合法的安全专家&#xff0c;他们通过合法途径寻找和修复安全漏洞&#xff0c;帮助企业和…...

【TypeScript】进阶之路语法细节,类型和函数

进阶之路 类型别名(type)的使用接口(interface)的声明的使用二者区别&#xff1a; 联合类型和交叉类型联合类型交叉类型 类型断言获取DOM元素 非空类型断言字面量类型的使用类型缩小&#xff08;类型收窄&#xff09;TypeScript 函数类型函数类型表达式内部规则检测函数的调用签…...

每日一题 611有效三角形的个数(相向双指针)

题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示例 2: 输入: nums [4,2,3,4] 输出: 4 题解 class Solu…...

Flink源码之JobMaster启动流程

Flink中Graph转换流程如下&#xff1a; Flink Job提交时各种类型Graph转换流程中&#xff0c;JobGraph是Client端形成StreamGraph后经过Operator Chain优化后形成的&#xff0c;然后提交给JobManager的Restserver&#xff0c;最终转发给JobManager的Dispatcher处理。 Completa…...

C#,数值计算——抛物线插值与Brent方法(Parabolic Interpolation and Brent‘s Method)的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// 抛物线插值与Brent方法 /// Parabolic Interpolation and Brents Method /// </summary> public class Brent : Bracketmethod { public double xmin { get; set…...

基于Selenium技术方案的爬取界面内容实践

1. 定位页面&#xff08;多窗口切换&#xff09; WebDriver提供了处理多个窗口的能力&#xff0c;这是通过使用“WebDriver.switchTo.window()”方法来切换到已知名称的窗口来实现的。如果名称未知&#xff0c;您可以使用“WebDriver.getWindowHandles()”获取已知窗口列表。您…...

线程记录(1)

创建线程&#xff1a; 一、1.继承Thread&#xff0c;重写run()&#xff0c;将操作写入其中 2.创建子类对象&#xff0c;start() 二、1.实现runnable接口&#xff0c;实现run() 2.创建子类对象&#xff0c;将子类对象作为参数传递到thread的构造器中&#xff0c;创建出Thread类…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...