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

题目

在这里插入图片描述

分析

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

桶排序全流程回顾

原数组: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.mzph.cn/news/632975.shtml

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

相关文章

领域特定语言(Domain-Specific Language, DSL)在 Visual Studio 2022中的实验——建立领域模型

一、环境 dotnet --version 8.0.101 Microsoft Visual Studio Enterprise 2022 (64 位) - Current 版本 17.8.4 已安装组件 ComponentLinkVisual Studiohttp://go.microsoft.com/fwlink/?LinkId185579Visual Studio SDKhttps://go.microsoft.com/fwlink/?li…

MILP加速运算技巧(三)——以OR-Tools设置惰性约束为例

文章目录 前言OR-Tools添加惰性约束的方法基于简单TSP的对比实验无惰性约束部分惰性约束完全惰性约束完整代码前言 在运筹学建模和求解过程中1,“lazy constraints”(惰性约束)是一种动态添加约束的策略。通常,在使用整数规划(Integer Programming)或混合整数规划(Mixe…

RTC讲解

RTC&#xff08;Real Time Clock&#xff09;实时时钟 RTC实时时钟本质上是一个独立的定时器。RTC模块拥有一组连续计数的32位无符号计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配…

提升开发效率,Fiddler Everywhere for Mac助您解决网络调试难题

在现代软件开发中&#xff0c;网络调试是一个不可或缺的环节。无论是前端开发还是后端开发&#xff0c;我们经常需要对网络请求进行监控和调试&#xff0c;以便及时发现并解决问题。而Fiddler Everywhere for Mac作为一款强大的网络调试工具&#xff0c;能够帮助开发者提升工作…

Ubuntu重启后进入initramfs导致无法开机

今晚&#xff0c;我的电脑意外关机&#xff0c;重新开机后打开了虚拟机后出现initramfs&#xff0c;一直无法开机。该虚拟机使用的是 vm17,系统是ubuntu20, 解决方案 使用如下命令查看和识别磁盘、分区或文件系统的信息 在initramfs后面输入 fsck /dev/sdb4 ,即修复上面损坏的…

git碰到最常见相关疑难操作记录

git相关疑难操作记录 文章目录 git相关疑难操作记录1 codeup里的git1.1 git 拉取v1代码1.2 git拉取V1代码最直接不用解决冲突的方法1.3 方法21.4 pre-commit 如果检查提示no files时候1.5 git ssh1.6 git push到算法库1.7 git push origin dev bug1.8 新环境配置codeup git ssh…

32 选择组件

效果演示 实现了一个复选框的动画效果&#xff0c;当复选框被选中时&#xff0c;复选框的前面会出现一个勾号&#xff0c;同时复选框的背景颜色会变成灰色&#xff0c;复选框旁边会出现一个火花效果。当复选框被取消选中时&#xff0c;复选框的勾号会消失&#xff0c;复选框的背…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

Docker(三)使用 Docker 镜像

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 使用 Docker 镜像 在之前的介绍中&#xff0c;我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

行驶证OCR识别应用领域有哪些?

随着科技的不断发展&#xff0c;OCR技术已经逐渐成熟&#xff0c;并在各个领域得到了广泛的应用。其中&#xff0c;OCR技术在行驶证识别领域的应用也日益受到关注。本文将重点介绍行驶证OCR识别的应用领域&#xff0c;以便更好地了解这一技术的应用前景。 首先&#xff0c;行驶…

尚硅谷Nginx高级配置笔记

写在前面&#xff1a;本笔记是学习尚硅谷nginx可成的时候的笔记&#xff0c;不是原创&#xff0c;如有需要&#xff0c;可以去官网看视频&#xff0c;以下是pdf文件 Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云…

计算机毕业设计----SSH会议室管理系统

项目介绍 本系统为基于jspsshmysql的会议室管理系统&#xff0c;包含普通用户和管理员&#xff0c;系统功能如下&#xff1a; 普通用户&#xff1a;会议室管理、会议管理、用户管理、个人资料。 管理员用户&#xff1a;会议室管理、会议管理、用户管理、部门管理、设备管理、个…

前端 文件下载方法

开头 欢迎查看此文件下载添加页面下载按钮添加下载方法 欢迎查看此文件下载 我们每个项目中都会有一个文件下载的需求&#xff0c;但有些小伙伴遇到这种问题不知道该如何解决&#xff0c;那我今天就来为大家讲解一下 添加页面下载按钮 <div><button click"dow…

基于docker创建nginx容器

docker一键安装可以参考我这个博客&#xff1a;一键安装docker 1.创建基础容器 docker run -p280:280 --name nginx -d nginx创建挂载到容器的宿主机文件夹 mkdir -p /home/000nginx-ebrms-ftp/html mkdir -p /home/000nginx-ebrms-ftp/logs mkdir -p /home/000nginx-ebrms-f…

使用vue2写一个太极图,并且点击旋转

下面是我自己写的一个代码&#xff0c;命名有些不规范&#xff0c;大家不要介意。 <template><div class"qq"><div class"app" :style"{ transform: rotateStyle }"><div class"app1"><div class"ap…

三坐标平台对环境的温度有要求吗——河北北重

三坐标铸铁平台对环境的温度有一定的要求。通常情况下&#xff0c;三坐标平台在使用过程中要求环境的温度保持在一定范围内&#xff0c;以确保测量数据的准确性和稳定性。 具体的温度要求可能会因不同的三坐标铸铁平台型号和制造商而有所不同&#xff0c;一般来说&#xff0c;常…

Unity Mirror VR联机开发 实战篇(二)

一、迁移示例中的联机物体 1、将MirrorExamplesVR工程中的部分文件夹复制到自己的工程中。 1、打开MirrorExamplesVR中的 SceneVR-Common场景。 2、将场景中没用的东西都删掉&#xff0c;只留下面这些&#xff0c;新建一个空物体XR Mirror&#xff0c;将所有剩下的物体拖成XR …

汽车连接器接线端子和多芯线束连接界面

冷压接的开式压接和闭式压接以及热压接的超声波焊接对汽车连接器接线端子和多芯线束连接界面 连接器接线端子和多芯线束的连接是电子线束行业&#xff0c;特别是汽车行业常用的导线连接方式。汽车整车线束又由许多分支线束组成&#xff0c;而分支线束必须通过连接器实现连接&am…

绝地求生【违规处罚工作公示】1月8日-1月14日

1月8日至1月14日期间&#xff0c;共计对174,636个违规账号进行了封禁&#xff0c;其中164,757个账号因使用外挂被永久封禁。 若您游戏中遇到违规行为&#xff0c;建议您优先在游戏内进行举报&#xff1b; 另外您也可以在官方微信公众号【PUBG国际版】中点击“ 服务中心 - 举报…

JavaSE核心基础-循环-笔记

1.for循环: for(初始条件&#xff1b;判断条件&#xff1b;步进表达){ 循环体 } for(int i1;i<10;i){ if(i9){ break; // 终止循环 } if(i4){ continue; // 继续下次循环&#xff0…