线性时间非比较类排序之基数排序

基数排序

基数排序是桶排序的扩展,因此又称“桶子法”,它是通过键值的部分信息,将要排序的元素分配至某些“桶”中,以达到排序的作用。

1. 算法思想

将各元素按位数切割成不同的数字,然后分别根据每个位数的比较结果进行排序。

2. 算法步骤

  1. 确定待排序序列的最大位数。
  2. 将所有待排序元素统一为最大数位长度(左补0)。
  3. 从最低位到最高位分别进行排序。
  4. 当最高位排序完成后,原数组变成有序序列。

3.算法分析

基数排序的执行效率非常高。我们要做的仅仅是把原始数据项从数组复制到链表中,然后再复制回去。如果待排序序列有10个数据项和 5个数位,则只需要10×2×5=100次复制:如果待排序序列有 100个数据和5个数位,则需要100×2×5=1000次复制⋯⋯复制次数和数据项的个数成正比,即O(n)。这简直就是最高效率的排序算法。
但是,当数据项增加 10倍时,一切就不一样了。关键字必须增加一位,多了一轮排序。复制的次数和数据项的个数与关键字长度成正比,可以认为关键字的长度是n的对数,因此在大多数情况下,基数排序的执行效率倒退为 O ( n l o g 2 n ) O(nlog_2 n) O(nlog2n),和快速排序差不多。
快速排序参考这篇文章
空间复杂度很好算,它是在分配元素时使用的桶空间,即10n,达此全间复杂度为O(n)。

4.算法代码

算法代码如下:
Python

# -*- coding: utf-8 -*-

# 基数排序
def radix_sort(arr) :
    maximum = max (arr) # 确定待排序数组中的最大位数
    d = 0 #d 为最大位数,初始为0
    while maximum != 0: # != ——不等于
        maximum = maximum // 10
        d += 1
    for i in range(d): # d轮排序
        s = [[] for k in range(10)] # 因为每一位数字都是0~9,所以建10个桶
        for j in arr:
            s[int(j /(10 ** i))%10].append(j) # 从个位数开始逐一进行分桶排序
        arr = [a for b in s for a in b] # 用10个桶回填原数组
    return arr

# 调用 radix-sort函数
print(radix_sort([34, 21, 13, 2, 5, 1,55,3, 1, 8]))

Java

  public static List<Integer> radixSort(List<Integer> arr) {
        int maximum = findMax(arr); // 确定待排序数组中的最大值
        int d = 0; // d 为最大位数,初始为0

        while (maximum != 0) {
            maximum /= 10;
            d++;
        }

        for (int i = 0; i < d; i++) { // d轮排序
            List<List<Integer>> buckets = new ArrayList<>();
            for (int k = 0; k < 10; k++) {
                buckets.add(new ArrayList<>());
            }

            for (int j : arr) {
                int digit = getDigit(j, i);
                buckets.get(digit).add(j);
            }
            arr = new ArrayList<>(); // 使用新的 ArrayList 替换旧的,以避免 UnsupportedOperationException
            for (List<Integer> bucket : buckets) {
                arr.addAll(bucket);
            }

        }

        return arr;
    }

    private static int findMax(List<Integer> arr) {
        int max = Integer.MIN_VALUE;
        for (int num : arr) {
            max = Math.max(max, num);
        }
        return max;
    }

    private static int getDigit(int number, int index) {
        int digit = number / (int) Math.pow(10, index);
        digit %= 10;
        return digit;
    }

        @Test
        void contextLoads () {
            List<Integer> arr = List.of(34, 21, 13, 2, 5, 1, 55, 3, 1, 8);
            arr = radixSort(arr);
            System.out.println(arr);
        }

5.输出结果

代码输出结果如下:
在这里插入图片描述

6. 算法过程分解

在这里插入图片描述

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

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

相关文章

在线问诊系统设计与实现的经验总结与整理

随着互联网技术的快速发展&#xff0c;在线问诊服务作为一种新兴的医疗服务模式&#xff0c;正逐渐受到人们的关注和使用。本文将介绍在线问诊系统的设计原则和关键组件&#xff0c;以及如何实现一个安全、高效和可扩展的在线医疗服务平台。 内容&#xff1a; 1. 引言 - 在…

Vulnhub靶场 DC-8

目录 一、环境搭建 二、信息收集 1、主机发现 2、指纹识别 三、漏洞复现 1、SQL注入 sqlmap工具 2、dirsearch目录探测 3、反弹shell 4、提权 exim4 5、获取flag 四、总结 一、环境搭建 Vulnhub靶机下载&#xff1a; 官网地址&#xff1a;https://download.vulnhub.com/dc/DC-…

Python算法题集_合并K个升序链表

Python算法题集_合并K个升序链表 题23&#xff1a;合并K个升序链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环】2) 改进版一【列表排序】3) 改进版二【堆排序】4) 改进版三【分区海选】 4. 最优算法 本文为Python算法题集之一的代…

论文介绍 FreeControl: 无需额外训练实现文本到图像的空间操控!

论文介绍 FreeControl: 无需额外训练实现文本到图像的空间操控&#xff01; 论文介绍 FreeControl: Training-Free Spatial Control of Any Text-to-Image Diffusion Model with Any Condition 关注微信公众号: DeepGo 项目地址&#xff1a;https://genforce.github.io/freeco…

【Java程序设计】【C00266】基于Springboot的超市进存销管理系统(有论文)

【Java程序设计】【C00266】基于Springboot的超市进存销管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的超市进销存系统 本系统分为登录注册模块、管理员功能模块以及员工功能模块。 登录注册模块&#…

Java学习18-- Override方法重写【★】

重点&#xff1a;super类 & 方法重写 ★看不明白多看几遍&#xff0c;记住static优先级>>高于override 重写Override methods★ 重写Override&#xff1a;child class可以覆盖father class中的method&#xff0c;即子类child class和父类father class有相同名称、…

如何部署一个高可用的 Linux 集群?

部署一个高可用的 Linux 集群需要经过多个步骤和考虑因素。以下是一个简要的指南&#xff0c;帮助您了解如何部署一个高可用的 Linux 集群&#xff1a; 确定需求和目标&#xff1a;在开始部署之前&#xff0c;您需要明确高可用性的定义和目标。对于一些组织而言&#xff0c;高…

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

2024春晚纸牌魔术原理----环形链表的约瑟夫问题

一.题目及剖析 https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a?tabnote 这道题涉及到数学原理,有一般公式,但我们先不用公式,看看如何用链表模拟出这一过程 二.思路引入 思路很简单,就试创建一个单向循环链表,然后模拟报数,删去对应的节点 三.代码引…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…

LeetCode:69.x的平方根

嗨嗨嗨&#xff0c;二分又来了&#xff0c;淦它&#xff0c; 这个题官解是&#xff0c;C函数法&#xff0c;二分&#xff0c;和牛顿迭代法&#xff08;暂且搁置&#xff09;&#xff0c; 当然还有暴力&#xff08;不必讨论&#xff0c;就从0开始一个一个试&#xff09;&#…

2.11日学习打卡----初学RocketMQ(二)

2.11日学习打卡 一. RocketMQ整合springboot 首先配置pom.xml文件 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>annotationProcessor</scope></dependency><dependency>…

服装效果图为何要用云渲染100?渲染100邀请码1a12

服装行业是充满创意和竞争的领域&#xff0c;而服装效果图是其中重要一环&#xff0c;以前效果图都是本地渲染&#xff0c;现在越来越多的设计师转向云渲染&#xff0c;以国内最专业的平台渲染100为例&#xff0c;云渲染有以下好处&#xff1a; 1、提高工作效率 设计师可以利用…

Netty源码系列 之 FastThreadLocal源码

目录 Netty优化方案之 FastThreadLocal 前言 ThreadLocal ThreadLocal是干什么的&#xff1f; 为什么要使用ThreadLocal工具类去操控存取目标数据到Thread线程 &#xff1f; ThreadLocal的使用场景 目标数据存储到Thread线程对象的哪里&#xff1f; 怎么样把一个目标数据…

JavaWeb:SpingBoot原理 --黑马笔记

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

Ubuntu Desktop - Terminal 输出全部选中 + 复制

Ubuntu Desktop - Terminal 输出全部选中 复制 1. Terminal2. Terminal 最大化3. Edit -> Select All4. Copy & PasteReferences 1. Terminal 2. Terminal 最大化 3. Edit -> Select All 4. Copy & Paste Edit -> Copy or Shift Ctrl C Edit -> Paste…

【Python网络编程之TCP三次握手】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之[TCP三次握手] 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2.…

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel&#xff0c;文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel&#xff0c;数据 -> 数据分析References 1. 打开 Excel&#xff0c;文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…

Win32 控制台绘图2

之前已经了解在控制台可以调用Win32 api绘图&#xff1b;下面继续加深一下此概念&#xff1b; #include <stdio.h> #include <stdlib.h> #include <windows.h>HWND WINAPI GetConsoleWindow();int main(int argc, char *argv[]) {HWND hwnd; HDC hdc; HPE…

【MySQL探索之旅】MySQL数据库下载及安装教程

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…