【Java数据结构】了解排序相关算法

server/2025/2/1 22:18:59/

基数排序

基数排序是桶排序的扩展,本质是将整数按位切割成不同的数字,然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。

  • 先对数组中每个数的个位比大小排序
  • 然后按照队列先进先出的顺序分别拿出数据
  • 再将拿出的数据分别对十位百位千位等位数比较大小,直到数组中最大值排完位数就结束(如果数组中位数不一致时,就相当于在高位添加0)
  • 最后一位排序完的结果就是最终排序的顺序。

 

关于基数排序大家可以了解原理即可,下面采用的是二维数组实现基数排序: 

    public static void main(String[] args) {int[] arr = { 4, 3, 7, 4, 9, 2, 10,171 };sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}int maxLength = 0;int ret = max;while (ret != 0){ret /= 10;maxLength++;}int[][] cur = new int[10][arr.length-1];int[] elementCount = new int[10];int n = 1;for(int i=0; i<maxLength; i++) {//基数排序的核心是下面两个for循环for (int j = 0; j < arr.length; j++) {int len = arr[j]/n % 10;cur[len][elementCount[len]] = arr[j];elementCount[len]++;}int index = 0;for (int j = 0; j < elementCount.length; j++) {if (elementCount[j] != 0) {for (int t = 0; t < elementCount[j]; t++) {arr[index] = cur[j][t];index++;}}elementCount[j] = 0;}n=n*10;}}

计数排序

计数数组是通过计数进行存数据,最后打印数据。

  • 首先我们需要找出数组中最大最小值
  • 然后再创建一个最大值减最小值的差值个计数数组
  • 然后分别遍历原数组中每一个数值,每遍历一个计数数组相应位置加1,直至数组遍历完
  • 最后再将计数数组中的数一个一个赋值给原数组中,这样就结束了
public static void countSort(int[] arr){int min = arr[0];int max = arr[0];for (int i = 1; i < arr.length; i++){if (min > arr[i]){min = arr[i];}if (max < arr[i]){max = arr[i];}}int[] count = new int[max - min+1];for (int i = 0; i < arr.length; i++){count[arr[i] - min]++;}int n = 0;for (int i = 0; i < count.length; i++){while (count[i] != 0){arr[n] = i+min;n++;count[i]--;}}
}
public static void main(String[] args) {int[] arr = { 4, 3, 7, 4, 9, 2, 10,171 };countSort(arr);System.out.println(Arrays.toString(arr));}

 当面临数组中比较稀疏的数值是,这个计数排序就会浪费很多空间,所以一般也不常使用这个排序,了解一下即可。


http://www.ppmy.cn/server/164179.html

相关文章

HTTPS 协议原理

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTPS 是什么&#x1f98b; 定义 二&#xff1a;&#x1f525; 概念准备&#x1f98b; 什么是"加密"&#x1f98b; 为什么要加密&#x1f98b; …

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文&#xff1a;https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图&#xff1a; 对应的xxx&#xff0c;在软件中查看 如上图&#xff1a;在每次发送 API 请求时&#xff0c;需要在 Header 中添加 以下键值对&a…

「全网最细 + 实战源码案例」设计模式——原型模式

核心思想 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式。它通过复制现有对象来创建新的对象&#xff0c;而不是通过实例化类。原型模式适用于创建成本较高或复杂的对象&#xff0c;或者需要避免暴露类内部复杂结构的场景。核心思想是“克隆”。 结…

基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现

【Flask】基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统旨在通过大数据分析和数据挖掘技术&#xff0c;结合Flask轻量级We…

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。

1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…

【算法设计与分析】实验5:贪心算法—装载及背包问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握贪心算法求解问题的思想&#xff1b;针对不同问题&#xff0c;会利用贪心算法进行问题建模、求解以及时间复杂度分析&#x…

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…

使用 PyTorch 实现线性回归:从零开始的完整指南

在机器学习中&#xff0c;线性回归是最基础且广泛使用的算法之一。它通过拟合数据点之间的线性关系&#xff0c;帮助我们理解和预测变量之间的关系。本文将通过一个简单的例子&#xff0c;展示如何使用 PyTorch 框架实现线性回归&#xff0c;并对自定义数据集进行拟合。 1. 线…