蓝桥杯每日一题---基数排序

题目

在这里插入图片描述

分析

在实际的比赛过程中很少会自己手写排序,顶多是定义一下排序规则。之所以要练习一下基数排序,是因为在后续学习过程中学到后缀数组时需要自己手写基数排序,那么这里使用的方法也和后缀数组一致,理解这里也便于后缀数组的学习。

桶排序全流程回顾

原数组:12 34 26 123 14 7

  1. 根据第一关键字即个位数放桶
    2号桶:12
    3号桶:123
    4号桶:34 14
    6号桶:26
    7号桶:7
  2. 根据关键字实现一轮排序
    12 123 34 14 26 7
  3. 根据第二关键字即十位数放桶
    0号桶:7
    1号桶:12 14
    2号桶:123 26
    3号桶:34
  4. 根据关键字实现一轮排序
    7 12 14 123 26 34
  5. 根据第三关键字即百位数放桶
    0号桶:7 12 14 26 34
    1号桶:123
  6. 根据关键字实现一轮排序
    7 12 14 26 34 123
    经过三轮排序后,原数组有序。

基数排序过程详细分析

标记每个数字属于哪个桶

直接通过数字对应的关键字表示就可以了,可以写一个get(x,k)函数,表示取出数字x的第k个关键字,代码如下

private static int get(int a,int k) {int id = 1;while(a>0) {if(id == k) return a%10;a/=10;id++;}return 0;
}

统计桶内存放的数字个数

count[get(a[j],i)]++;

2号桶(count=1):12
3号桶(count=1):123
4号桶(count=2):34 14
6号桶(count=1):26
7号桶(count=1):7

计算count的前缀和数组

count[j] += count[j-1];

2号桶(累积count=1):12
3号桶(累积count=2):123
4号桶(累积count=4):34 14
6号桶(累积count=5):26
7号桶(累积count=6):7

根据前缀和统计本轮排序后每个数字的位序

bu[count[get(a[j], i)]–] = a[j];

2号桶(累积count[2]=1):12
3号桶(累积count[3]=2):123
4号桶(累积count[4]=4):34 14
6号桶(累积count[6]=5):26
7号桶(累积count[7]=6):7

数字7的位序位累积count=6
数字26的位序位累积count=5
数字14的位序位累积count=4 count- -=3
数字34的位序位累积count=3
数字123的位序位累积count=2
数字12的位序位累积count=1

一轮排序后的结果为:
12 123 34 14 26 7

完整代码

import java.util.Arrays;
import java.util.Scanner;
public class 基数排序{
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int a[] = new int[n+1];int maxV = 0,max = 0;for (int i = 1; i <= n; i++) {a[i] = scanner.nextInt();maxV = Math.max(maxV, a[i]);}		int count[] = new int[10];int bu[] = new int[n+1];while(maxV > 0) {maxV /= 10;max++;}for(int i = 1;i <= max;i++) {Arrays.fill(count, 0);for (int j = 1; j <= n; j++) count[get(a[j],i)]++;for (int j = 1; j <= 9; j++) count[j] += count[j-1];for (int j = n; j > 0; j--) {int k = get(a[j], i);bu[count[k]--] = a[j];}for (int j = 1; j <= n; j++) a[j]=bu[j];}for (int i = 1; i <= n; i++)System.out.print(a[i] + " ");
}private static int get(int a,int k) {int id = 1;while(a>0) {if(id == k) return a%10;a/=10;id++;}return 0;
}
}

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

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

相关文章

LabVIEW交变配流泵性能测试系统

利用LabVIEW软件与高级硬件结合&#xff0c;开发交变配流泵性能测试系统。该系统不仅提高了测试精度&#xff0c;还优化了工业自动化流程&#xff0c;代表了液压系统测试技术的进步。 开发了一种高精度的测试系统&#xff0c;该系统能够综合评估交变配流泵的性能&#xff0c;包…

架构篇04-复杂度来源:高性能

文章目录 单机复杂度集群的复杂度小结 从本篇开始&#xff0c;我们一起深入分析架构设计复杂度的 6 个来源&#xff0c;先来聊聊复杂度的来源之一高性能。 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集…

网页设计(六)表格与表格页面布局

一、设计《TF43: 前端的发展与未来》日程表 《TF43: 前端的发展与未来》日程表 文字素材&#xff1a; 前端是互联网技术的重要一环&#xff0c;自上世纪80年代万维网技术创立以来&#xff0c;Web成就了大量成功的商业公司&#xff0c;也诞生了诸多优秀的技术解决方案。因其标…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…

什么是关键字?C语言的关键字有哪些?

目录 一、问题 二、解答 1、数据类型关键字&#xff08;12个&#xff09; (1) 声明和定义的区别 (2) 数据类型关键字 • char&#xff1a;声明字符型变量 1、声明字符变量 2、字符数组 3、ASCII码表示 4、指针与字符数组 5、多字节字符集&#xff08;如UTF-8&#xff…

Flutter中使用minio_new库

前言 在移动开发中&#xff0c;我们常常会遇到需要在App中处理文件上传和下载的需求。Minio是一个开源的对象存储服务&#xff0c;它兼容Amazon S3云存储服务接口&#xff0c;可以用于存储大规模非结构化的数据。 开始之前 在pubspec.yaml文件中添加minio_new库的依赖&#xf…

mac下配置git自定义快捷命令

1. 指定自定义别名 vi ~/.bash_profile open ~/.bash_profile 配置环境变量,插入类似下面的内容 .bash_profile文件 alias gcgit checkout alias gmgit commit -m alias gcbgit checkout -balias gtgit statusalias gagit add .alias glggit logalias gdgit diffalias gr…

一文教你V3+TS(保姆级教程)

TS 与 JS 的区别 基础类型 ts 的常用类型 ts 的常用基础类型分为两种&#xff1a; js 已有类型 原始类型&#xff1a;number/string/boolean/null/undefined/symbol 对象类型&#xff1a;object&#xff08;包括&#xff0c;数组、对象、函数等对象&#xff09; 每次编写前…

【XTuner 大模型单卡低成本微调实战】学习笔记

参考学习教程【XTuner 大模型单卡低成本微调实战】 理论 Finetune简介 大语言模型 微调模式 增量预训练 指令跟随微调 LoRA和QLoRA Xtuner介绍 实战 自定义微调 用 Medication QA 数据集进行微调 将数据转为 XTuner 的数据格式 目标格式&#xff1a;(.jsonL) 写提示词请C…

HANA:多个单值(Multiple)参数创建,传参,查询写法

作者 idan lian 如需转载备注出处 如果对你有帮助&#xff0c;请点赞收藏~~~ 1.场景 最近做hana视图&#xff0c;传参遇到了需要传多个单值的场景&#xff0c;比如看财务凭证明细表&#xff0c;需要跨年查看&#xff0c;参数刚好是年&#xff0c;就得分开输入&#xff0c;很…

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN Matlab语言…

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…