【八大排序】-- 基数排序(动图演示)

news2024/12/26 0:09:57

基数排序(桶排序)介绍

(1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。

(2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法。

(3)基数排序(Radix Sort)是桶排序的扩展。

(4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。
 

 步骤

1.找待排序元素中最大的数,确定其位数

2.准备10个数组, 0-9分别对应位数的0-9。

3.将所有待排序元素的个位数分别放入对应的0-9数组中。再从0-9的数组中依次从下标为0取出放入原待排序数组中。

4.将所有待排序元素的十位数分别放入对应的0-9数组中。再从0-9的数组中依次取出放入原待排序数组中。

5.将所有待排序元素的百位数分别放入对应的0-9数组中。再从0-9的数组中依次取出放入原待排序数组中。

......

6.直到最大位进行上述操作后,排序完成

动图演示

img

 算法代码

public static void basicSort(int[] elem) {
        //1. 找最大值
        if(elem.length == 0) return;
        int max = elem[0];
        for (int i = 0; i < elem.length; i++) {
            if(max < elem[i]) {
                max = elem[i];
            }
        }

        // 2.确定最大值的位数
        int num = 0;
        while(max > 0) {
            max/=10;
            num++;
        }


        //3. 创建10个数组

        int[][] array = new int[10][elem.length];
        int x = 0;
        while(num > 0) {
            int i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,i9=0;

            //放入
            for (int i = 0; i < elem.length; i++) {
                int tmp = (elem[i]/(int)Math.pow(10,x)) % 10;

                switch(tmp) {
                    case 0: array[0][i0] = elem[i];i0++; break;
                    case 1: array[1][i1] = elem[i];i1++; break;
                    case 2: array[2][i2] = elem[i];i2++; break;
                    case 3: array[3][i3] = elem[i];i3++; break;
                    case 4: array[4][i4] = elem[i];i4++; break;
                    case 5: array[5][i5] = elem[i];i5++; break;
                    case 6: array[6][i6] = elem[i];i6++; break;
                    case 7: array[7][i7] = elem[i];i7++; break;
                    case 8: array[8][i8] = elem[i];i8++; break;
                    case 9: array[9][i9] = elem[i];i9++; break;
                }
            }


            // 2.取出排序
            int j = 0;

            int tmp0 = i0;
            while(i0 >0) {
                elem[j] = array[0][tmp0-i0];
                i0--;
                j++;
            }
            int tmp1 = i1;
            while(i1 >0) {

                elem[j] = array[1][tmp1-i1];
                i1--;
                j++;
            }
            int tmp2 = i2;
            while(i2 >0) {
                elem[j] = array[2][tmp2-i2];
                i2--;
                j++;
            }
            int tmp3 = i3;
            while(i3 >0) {

                elem[j] = array[3][tmp3-i3];
                i3--;
                j++;
            }
            int tmp4 = i4;
            while(i4 >0) {

                elem[j] = array[4][tmp4-i4];
                i4--;
                j++;
            }
            int tmp5 = i5;
            while(i5 >0) {

                elem[j] = array[5][tmp5-i5];
                i5--;
                j++;
            }
            int tmp6 = i6;
            while(i6 >0) {

                elem[j] = array[6][tmp6-i6];
                i6--;
                j++;
            }
            int tmp7 = i7;
            while(i7 >0) {

                elem[j] = array[7][tmp7-i7];
                i7--;
                j++;
            }
            int tmp8 = i8;
            while(i8 >0) {

                elem[j] = array[8][tmp8-i8];
                i8--;
                j++;
            }
            int tmp9 = i9;
            while(i9 >0) {

                elem[j] = array[9][tmp9-i9];
                i9--;
                j++;
            }


            x++;
            num--;

        }

    }

测试打印

public static void main(String[] args) {

        int arr[] = {45,98,36,85,20,99,79,96,12,13,52,66,88,10,30};
        basicSort(arr);
        for (int i: arr) {
            System.out.print(i+" ");
        }
    }

基数排序说明

(1)基数排序是对传统桶排序的扩展,速度很快;

(2)基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError;

(3)基数排序时稳定的。[注:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的] ;

(4)有负数的数组,我们不用基数排序来进行排序, 
 

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

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

相关文章

【环境配置】Windows10-YOLOv8运行报错

问题如下&#xff1a; Windows10 运行 YOLOv8 出现如下错误&#xff1a; Traceback (most recent call last): File “”, line 1, in File “D:\anaconda3\envs\yolov8\Lib\multiprocessing\spawn.py”, line 116, in spawn_main exitcode _main(fd, parent_sentinel) ^^^^^…

【ROS】话题通信--从理论介绍到模型实现

1.简单介绍 话题通信是ROS中使用频率最高的一种通信模式&#xff0c;话题通信是基于发布订阅模式的&#xff0c;也即:一个节点发布消息&#xff0c;另一个节点订阅该消息。像雷达、摄像头、GPS… 等等一些传感器数据的采集&#xff0c;也都是使用了话题通信&#xff0c;换言之…

帆软大屏2.0企业制作

&#xfffc; 数字化观点中心 / 当前页 如何从0-1制作数据大屏&#xff0c;我用大白话给你解释清楚了 文 | 商业智能BI相关文章 阅读次数&#xff1a;18,192 次浏览 2023-06-08 11:51:49 好莱坞大片《摩天营救》中有这么一个场景&#xff1a; &#xfffc; 你可以看见反派大b…

设备数字化平台的优势和应用价值

在现代工业领域&#xff0c;设备的高效管理和维护对于企业的运营和竞争力至关重要。而设备管理系统作为一个强大的工具&#xff0c;可以极大地提升设备管理和维护的效率&#xff0c;从而实现生产效益的最大化。本文将探讨设备数字化平台的优势和应用价值。 设备数字化平台是一款…

蓝桥杯嵌入式省一教程:(一)点亮LED

如同所有编程入门的第一个教程——打印"Hello world"一样&#xff0c;点亮LED可以算得上是嵌入式开发中的"Hello world"&#xff0c;所有的单片机开发入门都从这里开始。 在点亮LED前&#xff0c;我们需要先了解一个重要概念——GPIO(General Purpose Inp…

【C++】queue容器

1.queue容器基本概念 2.queue常用接口 #include <iostream> using namespace std;//队列queue #include<queue>//创建Person类 class Person { public:Person(string name, int age){this->m_Name name;this->m_Age age;}string m_Name; //姓名int m_Age; …

【hive】hive中row_number() rank() dense_rank()的用法

hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的&#xff0c;通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序&#xff0c;有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …

04-分支语句和逻辑运算符

分支语句和逻辑运算符 6.1、if语句 if 结构 例子 统计输入的字符数、空格数 // if.cpp -- using the if statement #include <iostream> int main() {using std::cin; // using declarationsusing std::cout;char ch;int spaces 0;int total 0;cin.get(ch);wh…

mysql数据库设置创建时间和更新时间自动更新

1、创建时间&#xff1a;CURRENT_TIMESTAMP 2、修改时间&#xff1a;ON UPDATE CURRENT_TIMESTAMP DROP TABLE IF EXISTS mall_pay_info; CREATE TABLE mall_pay_info (id int(11) NOT NULL AUTO_INCREMENT,user_id int(11) DEFAULT NULL COMMENT 用户id,order_no bigint(20)…

IS3DH加速度计使用SPI和IIC方式读取数据LIS3DH中英文文档和测试代码

最近博主在研究一款低功耗加速度计LIS3DH&#xff0c;该加速度计有两种通信模式&#xff0c;IIC和SPI方式。IIC通信方式搞了一下 就好了&#xff0c;但是SPI方式针扎了两天才做出来&#xff0c;现在和大家分享一下心得。 开发环境&#xff1a;MDK keil5 使用芯片&#xff1a…

Centos7 配置Docker镜像加速器

daemon.json 文档说明&#xff1a; docker安装后默认没有daemon.json这个配置文件&#xff0c;需要进行手动创建&#xff0c;docker不管是在哪个平台以何种方式启动, 默认都会来这里读取配置,使用户可以统一管理不同系统下的 docker daemon 配置。 如果在daemon.json文件中进行…

Syncfusion Essential Studio JavaScrip Crack

Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…

Memory Allocators 101 - Write a simple memory allocator

Memory Allocators 101 - Write a simple memory allocator - Arjun Sreedharan BlogAboutContactPosts GoogleLinkedInGithubFacebookTwitterUMass Amherst 1:11 AM 9th 八月 20160 notes Memory Allocators 101 - Write a simple memory allocator Code related to this…

数据结构——B-树、B+树、B*树

一、B-树 1. B-树概念 B树是一种适合外查找的、平衡的多叉树。一棵m阶&#xff08;m>2&#xff09;的B树&#xff0c;是一棵平衡的M路平衡搜索树&#xff0c;它可以是空树或满足以下性质&#xff1a; &#xff08;1&#xff09;根节点至少有两个孩子。 &#xff08;2&#…

Integer中缓存池讲解

文章目录 一、简介二、实现原理三、修改缓存范围 一、简介 Integer缓存池是一种优化技术&#xff0c;用于提高整数对象的重用和性能。在Java中&#xff0c;对于整数值在 -128 到 127 之间的整数对象&#xff0c;会被放入缓存池中&#xff0c;以便重复使用。这是因为在这个范围…

UDP 的报文结构以及注意事项

UDP协议 1.UDP协议端格式 1.图中的16位UDP长度,表示整个数据报(UDP首部UDP数据)的最大长度 2.若校验和出错,会直接丢弃 2.UDP的报文结构 UDP报文主体分为两个部分:UDP报头(占8个字节)UDP载荷/UDP数据 1.源端口号 16位,2个字节 2.目的端口号 16位,2个字节 3.包长度 指示了…

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…

免费SAFe敏捷工具,SAFe框架执行

Leangoo领歌覆盖了敏捷项目研发全流程&#xff0c;包括小型团队敏捷开发&#xff0c;Scrum of Scrums大规模敏捷。 Leangoo领歌是ScrumCN&#xff08;scrum.cn&#xff09;旗下的一款永久免费的敏捷研发管理工具。 Leangoo领歌覆盖了敏捷研发全流程&#xff0c;包括小型团队敏…

七、Linux操作系统下,whichfind如何使用?

1、which命令 &#xff08;1&#xff09;语法&#xff1a;which 参数 &#xff08;2&#xff09;参数&#xff1a;要查找的命令 &#xff08;3&#xff09;示例&#xff1a; 2、find命令 &#xff08;1&#xff09;find 起始路径 -name “被查找的文件名” 注意&#xff1…

多环境_部署项目

多环境&#xff1a; 指同一套项目代码在不同的阶段需要根据实际情况来调整配置并且部署到不同的机器上。 为什么需要&#xff1f; 1. 每个环境互不影响 2. 区分不同的阶段&#xff1a;开发 / 测试 / 生产 3. 对项目进行优化&#xff1a; 1. 本地日志级别 2. 精简依赖&a…