java 实现 常见排序算法(四)基数排序

大家好,我是烤鸭:    

   今天分享一下基础排序算法之基数排序。

 

1.    基数排序:


原理:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort。

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

思路:

基数排序,即一个数位一个数位地进行排序,平常生活中我们经常使用的一种算法思想:如要对一个日期进行排序,日期中由年、月、日组成的,对于这个问题,我们经常使用的是先比较年份,如果相同再比较月份,如果还相同就比较日。

下面四个数进行排序:123、312、245、531

   个位 =>  十位 =>  百位

   531      312      123

   312      123      245

   123      531      312

   245      245      531

代码实现:

 /*** 基数排序* @param d* @param array*  时间复杂度 O的log2 N*  基数排序 运用二维数组来分别比较每一位,个位、十位、百位…* 输入10个整数的数组*/private void radixSort(int d,int[] array){long nowTime = System.nanoTime();int n=1;//代表位数对应的数:1,10,100000...int k=0;//保存每一位排序后的结果用于下一位的排序输入int[][] bucket=new int[10][array.length];//排序桶用于保存每次排序后的结果,这一位上排序结果相同的数字放在同一个桶里int[] num=new int[array.length];//用于保存每个桶里有多少个数字 ,最多为输入数组长度while(n<=d){for(int e:array) //将数组array里的每个数字放在相应的桶里{int digit=(e/n)%10;bucket[digit][num[digit]]=e;num[digit]++;}for(int i=0;i<array.length;i++)//将前一个循环生成的桶里的数据覆盖到原数组中用于保存这一位的排序结果{if(num[i]!=0)//这个桶里有数据,从上到下遍历这个桶并将数据保存到原数组中{for(int j=0;j<num[i];j++){array[k]=bucket[i][j];k++;}}num[i]=0;//将桶里计数器置0,用于下一次位排序}n*=10;k=0;//将k置0,用于下一轮保存位排序结果}System.out.println("基数排序,花费时间(ms):" + ((System.nanoTime() - nowTime) / 1000000.0) + "ms");}

基数排序是稳定算法,效率很高,其复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数。但它只能用在整数的排序中,且需要借助一定的辅助空间。

上面的代码适用有些局限在于对基数值选取:

int [] x = {25 ,11 ,22 ,34 ,15 ,44 ,76, 66, 100, 8 ,14, 20 ,2, 5 ,1 };

比如这个数组,基数应该选3。附上一个选择基数值的方法。

 /*** 获取基数排序中的基数* @param array* @return*/public int getRadixBasicNumber(int[] array){if(array == null && array.length ==0) {return 0;}int max =0;//1获取最大的绝对值的数for(int i =0;i<array.length;i++) {if(Math.abs(max)<Math.abs(array[i])) {max = array[i];}}int times = 0;if(max<0) max = -max;//2求出最大的绝对值的数,是10的times次幂。while(max >0) {max = max/10;times ++;}return times;}

 

耗时对比:

10W 条随机 数据 运行如图:

分别对比了基数排序,直插排序,希尔排序和快速排序。差距很明显。

50W 条随机 数据 运行如图:

分别对比了基数排序,直插排序,希尔排序和快速排序。差距很明显。

100W 条随机 数据 运行如图:

分别对比了基数排序,直插排序,希尔排序和快速排序。差距很明显。

总结:

基数排序

优点:效率高。

缺点:占用内存大,只能对正整数排序(采用二维数组做桶时)

最坏时间复杂度:O(P(N+B))。

平均时间复杂度为:O(P(N+B))。

其中P是排序的趟数,N是要被排序元素的个数,B是桶数。

各种排序方法比较:

 

更多排序算法:

冒泡排序   :  https://blog.csdn.net/Angry_Mills/article/details/81057900

插入排序   :  https://blog.csdn.net/Angry_Mills/article/details/81208700

快速排序   :  https://blog.csdn.net/Angry_Mills/article/details/83339390

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

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

相关文章

vyos User Guide

vyos User Guide 来源 https://wiki.vyos.net/wiki/User_Guide The VyOS User Guide is focused on providing a general overview of the installation, configuration, and operation of the VyOS network operating system. Introduction VyOS is a Linux-based network ope…

[css] 为什么要使用css sprites?

[css] 为什么要使用css sprites&#xff1f; 减少HTTP请求增加图片显示速度个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Java 面试题(3)—— JVM

JVM的内存结构。 JVM主要结构&#xff1a;堆内存、栈、方法区&#xff0c;程序计数器&#xff0c;永久代&#xff09;&#xff08;jdk 8采用元空间替代&#xff09;。 堆内存又分成年轻代和年老代。 年轻代由三部分组成&#xff0c;Eden、From Survivor 和 To Survivor&#xf…

[css] 标签、class和id选择器三者的区别是什么?分别在什么时候用?

[css] 标签、class和id选择器三者的区别是什么&#xff1f;分别在什么时候用&#xff1f; 标签选择器&#xff1a;tag{} 选取对应的标签例如 a span div class选择器&#xff1a;.class-name{} 选取对应class-name的元素 id选择器&#xff1a;#id-name{} 选取对应id的元素 其中…

web前端开发怎么样学习?看这份web前端学习路线

前端开发是创建Web页面或app等前端界面呈现给用户的过程。前端开发通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互。它从网页制作演变而来&#xff0c;名称上有很明显的时代特征。在互联网的演化进程中…

今天分享一下做支付宝小程序遇到的坑。ISV权限不足,建议在开发者中心检查对应功能是否已经添加。验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下做支付宝小程序遇到的坑。pom版本 <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-j…

[css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些?

[css] 举例说明时间、频率、角度、弧度、百分度的单位分别是哪些&#xff1f; 时间: s, ms频率: Hz角度: deg弧度: rad百分度: grad个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起…

[洛谷P4918]信仰收集

题目背景 随着各种势力的迁入,守矢神社丧失了不少信仰现在,为了挽回香火日益惨淡的神社,八坂神奈子派遣神社的风祝早苗去人类村落收集信仰 题目描述 你可以将村落看成一个m个点的有向无环图(编号从1−m),其中在某些点上有n簇待收集的信仰(每一簇都有一定的数量),图中有k有向边,…

Will not attempt to authenticate using SASL | dubbo项目启动特别慢,拉取 zookeeper 服务日志打印特别慢

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下使用dubbo遇到的几个问题。 1. cause: KeeperErrorCode ConnectionLoss for /dubbo/ xxx 异常如下&#xff1a; pid9965&qos.accept.foreign.ipfalse&qos.enabletrue&qos.port10887&timestamp1567…

[css] 你有用过table布局吗?说说你的感受

[css] 你有用过table布局吗&#xff1f;说说你的感受 用来做列表排版还是很不错的&#xff0c;但是要想用的好&#xff0c;还是要对table有比较多的了解。 比如实现表头固定&#xff0c;表内容超出滚动的效果等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

Java基础——类加载机制

什么叫类加载 JVM把 .class 字节码文件加载到内存&#xff0c;并进行相关的校验、解析、初始化&#xff0c;最终转换为虚拟机可用的JAVA类型的过程&#xff0c;称为JVM类加载机制。 &#xff08;当然&#xff0c;JVM并不关心class文件的来源&#xff0c;什么&#xff1f;什么叫…

redis集群搭建【简版】

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下redis集群安装&#xff0c;写的比较简单&#xff0c;就是做个记录。 1. 下载&安装 wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar -zxvf redis-5.0.4.tar.gz 解压并编译 https://redis.io/ 2.…

[css] 说说你对设备像素比的理解

[css] 说说你对设备像素比的理解 DPR 物理像素与逻辑像素的比个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

x-shell 通过堡垒机连接 ssh多个机器 自动化脚本

大家好&#xff0c;我是烤鸭&#xff1a; 1. 连接vpn 这一步就没什么说的了。我们用的easyconnect。登录后弹出堡垒机页面。 easyconnect 官网&#xff1a;https://sslvpn.zjweu.edu.cn/com/installClient.html 2. 登录堡垒机账号 登录堡垒机之后&#xff0c;如图&#xff…

Python 创建和使用类

python创建和使用类的方法如下 # class Dog(): # def __init__(self,name,age): # self.namename # self.ageage # # def sit(self): # print(self.name.title()"is now sitting") # # def roll_over(self): # print(se…

[css] 说下你对cursor属性的理解

[css] 说下你对cursor属性的理解 cursor 是鼠标光标的属性。可以给元素设置不同的cursor属性来使鼠标在不同的位置显示不同的形状。 值 描述 url 需使用的自定义光标的 URL。注释&#xff1a;请在此列表的末端始终定义一种普通的光标&#xff0c;以防没有由 URL 定义的可用光标…

mybatis 执行插入操作,insert 返回1,数据库中无数据。数据库中数据的创建时间和插入执行时间不一致。

大家好&#xff0c;我是烤鸭&#xff1a; 今天记录一下线上的问题&#xff0c;由于不是我们组的代码&#xff0c;所以没参与全程&#xff0c;只是最后有幸听各位大佬探讨解决方案。mybatis 执行插入操作&#xff0c;insert返回1&#xff0c;日志记录和接口返回都正常&#xff0…

敏捷软件开发学习笔记(四)之结构型设计模式

PHP结构型设计模式 参考 设计模式PHP 设计模式全集 2018什么是结构型是设计模式 结构型模式讲的是如何将类和对象按照某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;其中类结构型模式采用继承机制来组织接口和类&#xff0c;其中对象结构型模式采用组…

[css] position的relative和absolute定位原点是哪里?

[css] position的relative和absolute定位原点是哪里&#xff1f; absolute: 定位原点为第一个position不为static的父级元素的左上角。 可以基于该特性实现height:100%生效 relative&#xff1a;定位原点为元素本身的所在位置。 relative的偏移量设置会导致显示效果和定位原点…

javax.mail.MessagingException: while sending message;Connection reset by peer: socket write error

大家好&#xff0c;我是烤鸭&#xff1a; 阿里云邮件推送服务报错。当你也使用阿里云的邮件推送服务提示上面这个错误的话&#xff0c;我先告诉你原因和目前能想到的解决方案。 解决思路&#xff1a; 1. 换企业邮箱&#xff0c;阿里的上限15M&#xff0c;网易的不知道&…