基数排序简记

今天手敲 基数排序 代码的时候发现结果不对,这里简记一下原因。

第一版代码(错误)

public void radixSort(int[] arr) {
    // 1. 获取 arr 的最大位数
    int maxDigit = Arrays.stream(arr).max().getAsInt();
    int maxLen = String.valueOf(maxDigit).length();
    // 2. 定义 桶 和 计数数组
    int[][] buckets = new int[10][arr.length];
    int[] bucketCounts = new int[10];
    // 3. 进行 k 次排序
    for (int i = 0, n = 1; i < maxLen; i++, n *= 10) {
        // 3.1 将 arr 中的元素放入对应的桶中
        for (int j = 0; j < arr.length; j++) {
            int digitOfCurrent = arr[j] / n % 10;
            buckets[digitOfCurrent][bucketCounts[digitOfCurrent]] = arr[j];
            bucketCounts[digitOfCurrent]++;
        }
        // 3.2 对每个桶中的元素取出并覆盖 arr
        int index = 0;
        for (int k = 0; k < bucketCounts.length; k++) {
        // 注意,这里从 bucketCounts 中取值的时候是从后往前取得
            while (bucketCounts[k] > 0){
                arr[index++] = buckets[k][bucketCounts[k] - 1];
                bucketCounts[k]--;
            }
        }
    }
}

结果

这里以数组 arr = { 1, 52, 478, 12, 83, 7, 45, 333 }为例,
运行结果

debug

第一版代码在进行从 bucketCounts数组中取值时是从后往前取值的,虽然这样在第一次循环是不会出现问题,但是在后续的循环中会导致取值错乱现象。
第一次外层循环结束后(即 i = 0 结束后)
可以看到第一次结束后并没有对 buckets 进行清空。
在这里插入图片描述
第二次外层循环结束后(即 i = 1结束后)
在这里插入图片描述
第三次外层循环结束后(即 i = 2结束后)
在这里插入图片描述

第二版代码(正确)

public void radixSort(int[] arr) {
    // 1. 获取 arr 的最大位数
    int maxDigit = Arrays.stream(arr).max().getAsInt();
    int maxLen = String.valueOf(maxDigit).length();
    // 2. 定义 桶 和 计数数组
    int[][] buckets = new int[10][arr.length];
    int[] bucketCounts = new int[10];
    // 3. 进行 k 次排序
    for (int i = 0, n = 1; i < maxLen; i++, n *= 10) {
        // 3.1 将 arr 中的元素放入对应的桶中
        for (int j = 0; j < arr.length; j++) {
            int digitOfCurrent = arr[j] / n % 10;
            buckets[digitOfCurrent][bucketCounts[digitOfCurrent]] = arr[j];
            bucketCounts[digitOfCurrent]++;
        }
        // 3.2 对每个桶中的元素取出并覆盖 arr
        int index = 0;
        for (int k = 0; k < bucketCounts.length; k++) {
            if (bucketCounts[k] != 0) {
                // 注意这里一定要从前面开始取值
                for (int l = 0; l < bucketCounts[k]; l++) {
                    arr[index++] = buckets[k][l];
                }
                bucketCounts[k] = 0;
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赵本山:吃恐龙没?范伟:我想吃我吃的着吗?!

赵本山&#xff1a;吃恐龙没&#xff1f;范伟&#xff1a;我想吃我吃的着吗&#xff1f;&#xff01; ——小品《升职》&#xff08;中2&#xff09;的台词 &#xff08;接上&#xff09; 赵本山&#xff1a;据我多年的破案经验 一般罪犯心理这个时候都是手舞足蹈抓耳挠腮 …

算法导论 总结索引 | 第三部分 第十二章:二叉搜索树

1、搜索树数据结构 支持 许多动态集合操作&#xff0c;包括 SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT 和 DELETE 等。使用搜索树 既可以作为一个字典 又可以作为一个优先队列 2、二叉搜索树上的基本操作 所花费的时间 与这棵树的高度成正比。对于有n个结点的…

Android应用程序构成

binder Android应用程序是由Activity、 Service、 Broadcast Receiver和 Content Provider四种类型的组件构成的&#xff0c; 它们有可能运行在同一个进程中&#xff0c; 也有可能运行在不同的进程中。 此外&#xff0c; 各种系统组件也运行在独立的进程中&#xff0c; 例如&a…

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com&#xff0c;该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

Matlab|基于多目标粒子群算法的微电网优化调度

目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序为《基于多目标粒子群算法的微电网优化调度》-王金全文章的方法复现&#xff0c;考虑因素较文章复杂&#xff0c;除了考虑基本机组、储能等的出力&#xff0c;还考虑了弃风和弃光&#xff0c;很值得大家…

Docker Compose如何安装

Docker Compose的安装通常依赖于你的操作系统。以下是在不同操作系统中安装Docker Compose的方法&#xff1a; Linux 系统 //下载最新版本的Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(un…

大厂可视化平台之百度SugarBI:让数据价值一“幕”了然。

百度Sugar是百度智能云推出的敏捷BI和数据可视化平台&#xff0c;可以说是生产力具。 它旨在解决报表和大屏的数据BI分析和可视化问题&#xff0c;同时也是为了解放数据可视化系统的开发人力。百度Sugar基于百度Echarts提供丰富的图表组件&#xff0c;使得用户可以开箱即用、零…

spring框架学习记录(1)

前半个月一直在应付期中考试&#xff0c;快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

Linux进程——Linux下常见的进程状态

前言&#xff1a;在进程学习这一块&#xff0c;我们主要学习的就是PCB这个进程控制块&#xff0c;而PBC就是用来描述进程的结构体&#xff0c;而进程状态就是PCB结构体中的一个变量。 本篇主要内容&#xff1a; 操作系统中的进程状态Linux下的进程状态 在开始之前&#xff0c;我…

Redis学习笔记(基础)

Redis学习笔记&#xff08;基础&#xff09; 一、Nosql概述1.1、为什么使用Nosql1.2、什么是Nosql1.3、阿里巴巴演进分析1.4、NoSQL的四大分类 二、 Redis入门2.1、概述2.2、Windows使用Redis2.3、linux安装2.4、redis-benchmark性能测试2.5、Redis基础知识 三、五大数据类型3.…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号&#xff1a;08 文章目录 Linu…

初始Java篇(JavaSE基础语法)(7)抽象类和接口(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 目录 抽象类 抽象类的概念&#xff1a; 抽象类语法 抽象类特性 抽象类的作用 接口 接口的概念&#xff1a; 语法规则 接口…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira&#xff1a; 企业广泛使用的项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述&#xff1a; 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

一&#xff1a;memcpy的使用和模拟 memcpy使用时需要包含的头文件为#include<string.h> void* memcpy(void* destination,const void* source,size_t num) 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置&#xff08;特别注意的是…

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

「C++ 内存管理篇 04」动态二维数组

目录 一. 使用calloc/free开辟和释放二维数组 二、 使用new/delete开辟和释放二维数组 一. 使用calloc/free开辟和释放二维数组 让一个二级指针变量存放动态开辟的一级指针数组的起始地址&#xff0c;然后让这些一级指针指向动态开辟的基本类型的数组&#xff1a; // 开辟一个大…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数浅拷贝深拷贝构造函数实现 析构函数赋值重载 迭代器begin & endrbegin & rend 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 总结 前言 模拟实现不是为了写得和库里面一样好。而是为了更好的了解底层…

一行代码将文件存储到本地或各种存储平台

一行代码将文件存储到本地或各种存储平台 这里我们介绍的是一个开源项目。 这个是他的官网 简介 (xuyanwu.cn) 下面来看他的一个介绍&#xff1a; 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS…

R语言学习—1—将数据框中某一列数据改成行名

将数据框中某一列数据改成行名 代码 结果