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

基数排序

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

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 为最大位数,初始为0while maximum != 0: # != ——不等于maximum = maximum // 10d += 1for 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 为最大位数,初始为0while (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 替换旧的,以避免 UnsupportedOperationExceptionfor (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;}@Testvoid 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. 算法过程分解

在这里插入图片描述

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

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

相关文章

SCI论文作图规范

SCI论文作图规范包括以下几个方面&#xff1a; 一、图片格式 SCI论文通常接受的图片格式包括TIFF、EPS和PDF等。其中&#xff0c;TIFF格式是一种高质量的图像格式&#xff0c;适用于需要高分辨率和颜色准确性的图片&#xff1b;EPS格式是一种矢量图形格式&#xff0c;适用于需…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址&#xff1a;https://developer.android.com/studio/archive androi…

Acwing 5469. 有效点对【正难则反+巧妙选择根节点】

原题链接&#xff1a;https://www.acwing.com/problem/content/5472/ 题目描述&#xff1a; 给定一个 n 个节点的无向树&#xff0c;节点编号 1∼n。 树上有两个不同的特殊点 x,y&#xff0c;对于树中的每一个点对 (u,v)(u≠v)&#xff0c;如果从 u 到 v 的最短路径需要经过…

算法沉淀——模拟(leetcode真题剖析)

算法沉淀——模拟 01.替换所有的问号02.提莫攻击03.Z字形变换04.外观数列05.数青蛙 模拟算法是一种通过模拟问题的描述或场景来解决问题的算法。这种算法的核心思想是按照问题描述的规则&#xff0c;逐步模拟问题的发展过程&#xff0c;从而得到问题的解决方案。通常&#xff0…

第7讲 全局异常统一处理实现

新建GlobalExceptionHandler类。 package com.java1234.exception;import com.java1234.entity.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdv…

【MATLAB】GA_BP神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 GA_BP神经网络回归预测算法结合了遗传算法&#xff08;Genetic Algorithm, GA&#xff09;和BP神经网络&#xff08;Backpropagation Neural Network, BPNN&#xff09;&#xff0c;用于解…

《21天精通IPv4 to IPv6》第16天:IPv6网络的故障排除——如何排除IPv6网络故障? ️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

万界星空科技低代码平台与MES的完美结合

低代码与MES系统相结合 ​​低代码平台通常是指aPaaS平台&#xff0c;通过为开发者提供可视化的应用开发环境&#xff0c;降低或去除应用开发对原生代码编写的需求量&#xff0c;进而实现便捷构建应用程序的一种解决方案。 更加简单点的理解就是“拖拽&#xff01;搭建应用”。…

二十、K8S-1-权限管理RBAC详解

目录 k8s RBAC 权限管理详解 一、简介 二、用户分类 1、普通用户 2、ServiceAccount 三、k8s角色&角色绑定 1、授权介绍&#xff1a; 1.1 定义角色&#xff1a; 1.2 绑定角色&#xff1a; 1.3主体&#xff08;subject&#xff09; 2、角色&#xff08;Role和Cluster…

【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

知识回顾 通过前文&#xff0c;我们了解到线性表是具有相同数据类型的有限个数据元素序列&#xff1b;并且&#xff0c;线性表只是一种逻辑结构&#xff0c;其不同存储形式所展现出的也略有不同&#xff0c;那么今天我们来了解一下线性表的顺序存储——顺序表。 顺序表的定义 …

nodejs切换版本

sudo n 18.17.0 sudo n然后键盘上下选择

进程间通信[二]

命名管道 mkfifo filename 创建管道 共享内存 systemV 就是一段内存映射到两个进程之中&#xff0c;这段内存就是双方都可以看到同一块公共空间&#xff0c;变具备了进程间通信的前提条件。把映射去掉&#xff0c;然后释放空间&#xff0c;这就是释放共享内存。 共享内存…