Java基数排序知识点(含面试大厂题和源码)

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。它通过从最低位(个位)开始排序,然后逐渐转向最高位,对每一位进行稳定的排序(使用计数排序或桶排序),从而达到整体排序的目的。

算法原理

基数排序的工作原理如下:

  1. 找出最大数的位数:确定排序的轮数,即从个位开始,到最大数的位数结束。
  2. 按位进行排序:从最低位(个位)开始,对每一位进行排序。可以使用计数排序或桶排序来完成这一步骤。
  3. 重复步骤:对每一位进行排序后,移动到下一位,重复排序过程,直到所有位数都被排序。

算法实现

以下是基数排序的Java实现示例:

import java.util.Arrays;public class RadixSortExample {public static void main(String[] args) {int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};radixSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}public static void radixSort(int[] arr) {if (arr == null || arr.length == 0) {return;}// 找到最大数的位数int max = Arrays.stream(arr).max().getAsInt();int significantDigits = (int) Math.log10(max) + 1; // 以10为底的对数// 从个位开始,按位进行排序for (int i = 1; i <= significantDigits; i *= 10) {countingSortByDigit(arr, i);}}private static void countingSortByDigit(int[] arr, int digit) {int n = arr.length;int[] output = new int[n];int[] count = new int[10];// 计算频率数组for (int i = 0; i < n; i++) {int digitValue = (arr[i] / digit) % 10;count[digitValue]++;}// 累计频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 根据频率数组和当前位的值,放置到输出数组for (int i = n - 1; i >= 0; i--) {int digitValue = (arr[i] / digit) % 10;output[count[digitValue] - 1] = arr[i];count[digitValue]--;}// 将输出数组复制回原数组System.arraycopy(output, 0, arr, 0, n);}
}

算法适用性

基数排序适用于以下场景:

  1. 待排序数组中的元素是整数或可以转换为整数的字符串。
  2. 待排序数组中的元素位数固定或相差不大。

算法优缺点

优点

  1. 基数排序可以实现线性时间复杂度 O(nk),其中 n 是待排序数组的长度,k 是最大数的位数。
  2. 基数排序是一种稳定的排序算法,相同元素的相对顺序保持不变。

缺点

  1. 基数排序需要额外的空间来存储计数数组和输出数组。
  2. 当元素的位数非常大时,基数排序可能需要较长的预处理时间和额外空间。

通过理解和实践基数排序,你可以在面试中更好地展示你的算法能力和问题解决技巧。希望这些信息能够帮助你在面试中取得成功。

题目 1:实现基本的基数排序

描述
给定一个非负整数数组 arr,实现一个基数排序算法对其进行排序。

要求

  • 不使用任何现成的排序库或函数。
  • 保持排序的稳定性。

示例
输入:[170, 45, 75, 90, 802, 24, 2, 66]
输出:[2, 24, 45, 66, 75, 90, 170, 802]

Java 源码

import java.util.Arrays;public class RadixSortExample1 {public static void main(String[] args) {int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};radixSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}public static void radixSort(int[] arr) {if (arr == null || arr.length == 0) {return;}int max = Arrays.stream(arr).max().getAsInt();int significantDigits = (int) Math.log10(max) + 1;for (int i = 1; i <= significantDigits; i *= 10) {countingSortByDigit(arr, i);}}private static void countingSortByDigit(int[] arr, int digit) {int n = arr.length;int[] output = new int[n];int[] count = new int[10];// 计算频率数组for (int i = 0; i < n; i++) {int digitValue = (arr[i] / digit) % 10;count[digitValue]++;}// 累计频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 根据频率数组和当前位的值,放置到输出数组for (int i = n - 1; i >= 0; i--) {int digitValue = (arr[i] / digit) % 10;output[count[digitValue] - 1] = arr[i];count[digitValue]--;}// 将输出数组复制回原数组System.arraycopy(output, 0, arr, 0, n);}
}

题目 2:基数排序处理负数

描述
给定一个包含负数的整数数组 arr,使用基数排序算法对其进行排序。

要求

  • 能够处理负数。
  • 保持排序的稳定性。

示例
输入:[-12, -3, 0, 5, -17, 50, 6, 2]
输出:[-17, -12, -3, 0, 2, 5, 6, 50]

Java 源码

import java.util.Arrays;public class RadixSortExample2 {public static void main(String[] args) {int[] arr = {-12, -3, 0, 5, -17, 50, 6, 2};radixSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}public static void radixSort(int[] arr) {if (arr == null || arr.length == 0) {return;}int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();int significantDigits = (int) Math.log10(Math.abs(max) + 1) + 1;for (int i = 1; i <= significantDigits; i *= 10) {countingSortByDigit(arr, i, min);}}private static void countingSortByDigit(int[] arr, int digit, int min) {int n = arr.length;int[] output = new int[n];int[] count = new int[10];// 计算频率数组for (int i = 0; i < n; i++) {int digitValue = ((arr[i] - min) / digit) % 10;count[digitValue]++;}// 累计频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 根据频率数组和当前位的值,放置到输出数组for (int i = n - 1; i >= 0; i--) {int digitValue = ((arr[i] - min) / digit) % 10;output[count[digitValue] - 1] = arr[i];count[digitValue]--;}// 将输出数组复制回原数组System.arraycopy(output, 0, arr, 0, n);}
}

题目 3:基数排序字符串数组

描述
给定一个字符串数组 arr,其中每个字符串表示一个整数,使用基数排序算法对这些整数进行排序。

要求

  • 字符串可能包含前导零。
  • 保持排序的稳定性。

示例
输入:["100", "3", "20", "10"]
输出:["3", "10", "100", "20"]

Java 源码

import java.util.Arrays;public class RadixSortExample3 {public static void main(String[] args) {String[] arr = {"100", "3", "20", "10"};radixSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}public static void radixSort(String[] arr) {if (arr == null || arr.length == 0) {return;}int maxLen = Arrays.stream(arr).map(String::length).max().getAsInt();for (int i = 1; i <= maxLen; i++) {countingSortByDigit(arr, i);}}private static void countingSortByDigit(String[] arr, int digit) {int[] count = new int[10];String[] output = new String[arr.length];// 计算频率数组for (String s : arr) {int digitValue = (s.charAt(digit - 1) - '0');count[digitValue]++;}// 累计频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 根据频率数组和当前位的值,放置到输出数组for (int i = arr.length - 1; i >= 0; i--) {String s = arr[i];int digitValue = (s.charAt(digit - 1) - '0');output[count[digitValue] - 1] = s;count[digitValue]--;}// 将输出数组复制回原数组System.arraycopy(output, 0, arr, 0, arr.length);}
}

这些题目和代码示例可以帮助你更好地理解和掌握基数排序算法,以及如何在实际问题中应用这一算法。在面试中,你可能会遇到类似的问题,希望这些示例能够帮助你做好准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arcgis研究区图经纬度(南北)切换为英文字体(SN)

只在做英文论文研究区图的时候用&#xff0c;平常为了方便还是切换为中文

MySQL中 in 和 exists 区别

在MySQL中&#xff0c;IN和EXISTS都是用于在子查询中测试条件的操作符&#xff0c;但它们在处理和效率上有一些重要的区别。MySQL中的in语句是把外表和内表作hash连接&#xff0c;⽽exists语句是对外表作loop循环&#xff0c;每次loop循环再对内表进⾏查询。⼤家⼀直认为exists…

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件&#xff0c;如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

作业3:计算机体系结构属性优选

作业3&#xff1a;计算机体系结构属性优选 一. 单选题&#xff08;共11题&#xff0c;55分&#xff09; (单选题)下列哪个选项属于非线性结构&#xff08; &#xff09;&#xff1f; A. 线性表 B. 栈 C. 树 D. 队列 正确答案: C:树; (单选题) 浮点数在机器中的表示形式如下所…

运行sentinel Java环境不是8以及端口被占用如何运行

1.Java环境不是8 运行sentinel (没有耐心直接看第三点) java --add-opens java.base/java.langALL-UNNAMED -jar sentinel-dashboard-1.8.1.jar2.8080端口被使用 运行 sentinel java -jar -Dserver.port8090 sentinel-dashboard-1.8.1.jar3.8080端口占用和Java环境不是8 运行…

JS详解-fetch核心语法

document.querySelector(.btn).addEventListener(click,async () > {const p new URLSearchParams({pname:浙江省,cname:杭州市})//1、如何请求&#xff1f;默认为get&#xff0c;参数1 url地址&#xff0c;返回promiseconst res await fetch(http://hmajax.itheima.net/…

给你一个网站如何测试?

主要围绕&#xff0c;功能&#xff0c;页面 UI &#xff0c;兼容&#xff0c;性能&#xff0c;安全&#xff0c;这几个方面去聊&#xff0c;首先是制定测试计划&#xff0c;确定测试范围和测试策略&#xff0c;一般包括以下几个部分&#xff1a;功能性测试&#xff1b;界面测试…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好&#xff0c;相信大家平时在处理问题时都有各自的方式&#xff0c;最常用以及最好用的感觉还是断点调试&#xff0c;但是涉及到操作数据库的执行时&#xff0c;默认的话在控制台…

Comfyui插件CLIPSeg应该如何安装

✨背景 GitHub - biegert/ComfyUI-CLIPSeg: ComfyUI CLIPSeg Comfyui-CLIPSeg是一个相对没那么大众的插件&#xff0c;在基于语义分割和自动抠图方面&#xff0c;还是比较实用的一个插件。但是插件安装起来&#xff0c;跟普通的插件安装有亿点不一样&#xff0c;所以很多小朋友…

pipx和conda

pipx pipx是一个用于安装和运行Python应用的工具&#xff0c;它可以为每个安装的应用创建独立的虚拟环境&#xff0c;从而避免依赖冲突和污染全局环境。以下是一些常见的pipx用法&#xff1a; 安装pipx 首先&#xff0c;确保你已经安装了pipx。如果还没有安装&#xff0c;可…

excel中文本列显示e+17这样的科学计数法如何处理

我的excel中文本列显示e17这样的科学计数法 然后右键&#xff0c;设置单元格格式&#xff0c;为特殊&#xff0c;邮政编码&#xff0c;点确定即可 最后效果如下

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——day05_SpringBootWeb请求响应

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规&#xff0c;不再局限于过时的老套JavaWeb技术&#xff0c;而是与时俱进&#xff0c;运用的都是企业中流行的前沿技术。笔者认真跟着这个教程&#xff0c;再一次认真学习一遍JavaWeb教程&#xff0c;温故而知新&…

如何通过ArkTS卡片的Canvas自定义绘制能力实现五子棋游戏卡片

介绍 本示例展示了如何通过ArkTS卡片的Canvas自定义绘制能力实现一个简单的五子棋游戏卡片。 使用Canvas绘制棋盘和黑白棋子的落子。通过卡片支持的点击事件进行交互&#xff0c;让用户在棋盘上进行黑白棋子的对局。通过TS的逻辑代码实现五子棋输赢判定、回退等逻辑计算&…

算法沉淀 —— 动态规划(子序列问题(上))

算法沉淀 —— 动态规划&#xff08;子序列问题&#xff08;上&#xff09;&#xff09; 前言一、最长递增子序列二、摆动序列三、 最长递增子序列的个数四、最长数对链 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示…

BigInteger 大整数 比较大小

一、以整数型礼品交易为例子 int userSend Integer.valueOf(id);int amount Integer.valueOf(amountStr);int userAccept Integer.valueOf(userIdAccept);GiftService giftService new GiftService();boolean carry1 giftService.isHavePropertyByUserIdByGiftId(userSend…

代码随想录算法训练营第43天|1049. 最后一块石头的重量 II |494. 目标和 | 474.一和零

代码随想录算法训练营第43天|1049. 最后一块石头的重量 II |494. 目标和 | 474.一和零 (01背包确实难&#xff0c;但是我是通过 https://www.bilibili.com/video/BV1pY4y1J7na/?spm_id_from333.999.list.card_archive.click&vd_sourcebefaa5fdd7527c53ef9f1b7fccaf9b25 再…

Minikube本地搭建单节点Kubernetes集群

1、什么是 Minikube Minikube 是一个开源工具&#xff0c;旨在为开发者提供一种便捷的方式在本地环境中搭建单节点的 Kubernetes 集群。它主要用于开发、测试和学习 Kubernetes 应用程序&#xff0c;无需依赖大型的硬件资源或复杂的多节点集群配置。minikube 使用轻量级虚拟化技…

蓝桥杯每日一题(快速幂、组合计数)

875 快速幂 快速幂就是将a^k看做是a^2^0和a^2^1……相乘。(相邻两个数是平方关系) 巧妙的是这个时候k就是多个2^n的组合&#xff0c;也就是可以二进制表示。 所以就可以用k的二进制某一位是否为1&#xff0c;判断最后的结果是否乘以a^2^n。 错误点&#xff1a;权值不用初始…

穿透 雪崩 击穿

一、redis的三大缓存问题 正常情况下&#xff0c;大部分的访问请求应该是先被redis响应的&#xff0c;在redis那里得不到响应的小部分访问请 求才会去请求MySQL数据库获取数据&#xff0c;这样MySQL数据库的负载压力是非常小的&#xff0c;且可以正常工 作 缓存雪崩/穿透/击…

Linux中的conntrack命令深入解析

在Linux网络管理和监控领域&#xff0c;conntrack命令是一个强大的工具&#xff0c;它提供了对netfilter连接跟踪系统的直接访问&#x1f50d;。这篇文章将深入探讨conntrack的由来、底层原理、参数意义&#xff0c;以及其常见用法&#xff0c;并对返回结果的每个字段进行详细解…