基数排序——java
发布日期:2021-06-07 05:56:26
浏览次数:5
分类:技术文章
本文共 2791 字,大约阅读时间需要 9 分钟。
基数排序
时间复杂度:O(d*(r+n)) 空间复杂度:O(r*d+n) 【r–>关键字的基数,d–>长度,n–>关键字的个数】 稳定 核心代码import java.util.ArrayList;import java.util.List;/** * 基数排序 * @author jin * */public class RadixSort { public void radix(int[] array) { int max = array[0]; for (int i = 0; i < array.length; i++) { // 得到数组的最大值 if (max < array[i]) { max = array[i]; } } int time = 0; while (max > 0) { // 判断位数 max /= 10; time++; } // 建立10个队列 Listqueue = new ArrayList (); for (int i = 0; i < 10; i++) { ArrayList queue1 = new ArrayList (); queue.add(queue1); } // 进行time次分配和收集 for (int i = 0; i < time; i++) { // 分配数组元素 for (int j = 0; j < array.length; j++) { // 得到数字的第time+1位数 // Math.pow(double a,double b)为a的b次方 int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i); ArrayList queue2 = queue.get(x); queue2.add(array[j]); queue.set(x, queue2); } int count = 0;// 元素计数器; // 收集队列元素; for (int k = 0; k < 10; k++) { while (queue.get(k).size() > 0) { //第k个队列的长度 ArrayList queue3 = queue.get(k);//把第k个对列给queue3 array[count] = queue3.get(0);//把queue3的第一个值值给array queue3.remove(0);//给一次,就删除一次第一个元素 count++; } } } } public void radixSort() { int[] a = { 2,35, 684, 557, 44, 644, 801, 99, 70, 0,54,78,23 }; radix(a); for (int i = 0; i < a.length; i++){ System.out.println(a[i]); } } }
基数排序是从最低位个位开始比较,按0~9的顺序排序;然后再按倒数第二位十位比较……一直到最高位,排完后,就实现了整个数组的排序。
步骤: (1)先求最大的数有几位数,int max=a[0]; for(int i=1;i
(2)建队列,在这个队列中再建10个队列,代表0~9,这10个数;
Arraylistqueue=new ArrayList ();for(int i=0;i<10;i++){ ArrayList queue1=new ArrayList (); queue.add(queue1); }
相当于:
queue–>[ ]; queue1添加进queue后–>[ [],[],[],[],[],[],[],[],[],[] ]; (3)从最后一位到最高位,依次比较大小,某一位数相同的数,放入一个队列中;for(int i=0;iqueue2=queue.get(x);//此处的x为queue队列的索引 queue2.add(a[j]);//把a[j]的元素添加到queue2队列中 queue.set(x,queue2);//把queue2放入对应的queue队列中 } int count =0; for(int k=0;k<10;k++){ while(queue.get(k).size()>0){ ArrayList queue3=queue.get(k);//从queue队列中取出k对应的元素给queue3 a[count]=queue3.get(0);//queue3中只有0这个索引,即只有一个元素 aueue3.remove(0);//把queue3中的元素清空了,以便下一个循环使用 count++; } }}
Math.pow(double a,double b)为a的b次方;
例:546%(int)Math.pow(10,1)/(int)Math.pow(10,0)=6;546%(int)Math.pow(10,2)/(int)Math.pow(10,1)=4;546%(int)Math.pow(10,3)/(int)Math.pow(10,2)=5;
转载地址:https://blog.csdn.net/Levi_moon/article/details/51484389 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月19日 22时07分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
svn提交的一个坑
2019-04-27
eclipse识别不了模拟器解决办法
2019-04-27
unity mesh合并
2019-04-27
谈谈类之间的关联关系与依赖关系
2019-04-27
unity5.x assetbundle打包和加载
2019-04-27
C#用正则表达式去匹配被双引号包起来的中文
2019-04-27
lua table排序
2019-04-27
Unity发布的ios包在iphone上声音是从听筒里出来的问题
2019-04-27
UIScrollView复用节点示例
2019-04-27
Unity 5 AudioMixer
2019-04-27
Unity 代码混淆: CodeGuard的使用
2019-04-27
UGUI 列表循环使用
2019-04-27
使用命令行运行unity并执行某个静态函数(运用于命令行打包和批量打包)
2019-04-27
web.py框架
2019-04-27
web.py学习笔记
2019-04-27
python的代码缩进
2019-04-27
A* Pathfinding Project (Unity A*寻路插件) 使用教程
2019-04-27
bash学习笔记
2019-04-27
sqlite学习
2019-04-27