基数排序——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个队列 List
queue = 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个数;

Arraylist
queue=new ArrayList
();for(int i=0;i<10;i++){ ArrayList
queue1=new ArrayList
(); queue.add(queue1); }

相当于:

queue–>[ ];
queue1添加进queue后–>[ [],[],[],[],[],[],[],[],[],[] ];
(3)从最后一位到最高位,依次比较大小,某一位数相同的数,放入一个队列中;

for(int i=0;i
queue2=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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:桶排序——java
下一篇:归并排序——java

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月19日 22时07分13秒