基数排序将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后,从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始,LSD适应与那些位数较少的数字进行排序,而对于位数较多的数选择MSD效果要好,下面这个例子我是选用的LSD的排序方式
package com.lamp.sort;
import java.util.Arrays;
public class RadixSortTest {
public static void main(String[] args) {
int[] data = { 5, 20, 4, 15, 11};
printArray(data);
System.out.println("\r" + "升序排序后-------");
//数组中最多位数为2,设定基数为10进行排序
sortArrayAsc(data, 10, 2);
printArray(data);
//System.out.println("\r" + "降序排序后-------");
//数组中最多位数为2,设定基数为10进行排序
//sortArrayDesc(data, 10, 2);
//printArray(data);
}
//升幂排序
private static void sortArrayAsc(int[] data, int radix, int d) {
//定义一个临时数组大小和data数组相等
int[] temp = new int[data.length];
//定义一个位计数器,用来存放当前位的元素有多少个
int[] bucket = new int[radix];
int rate = 1;
for (int i = 0; i < d; i++) {
//将data数组中的各个元素复制到temp数组中
System.arraycopy(data, 0, temp, 0, data.length);
//将bucket数组的各个元素重置0
Arrays.fill(bucket, 0);
//当i等于0时,原数组为5, 20, 4, 15, 11,个位数的值分别为5,0,4,5,1
//此时bucket数组的值为1,1,0,,0,1,2,0,0,0,0即个位数为0,1,4的数各一个,个位数为5
//的数有两个,并将较大的数置于较后
for (int j = 0; j < data.length; j++) {
int index = (temp[j] / rate) % radix;
bucket[index] += 1;
}
//统计各元素出现位置,拿原数组来说,个位数为0的数出现了一次,位置为1,个位数为1的数也出现了
//一次,此时它的实际位置应该为自身出现个数与0出现个数之和,其余元素位置同理
//经过循环后的bucket数组为1,2,2,2,3,5,5,5,5,5
for (int j = 1; j < bucket.length; j++) {
bucket[j] = bucket[j] + bucket[j - 1];
}
for (int j = data.length - 1; j >= 0; j--) {
//当j等于data.length时,即j=4时,temp[4]=11,index的值为1,由于数组下标值比元素位置小1
//data[--2]=11,即data[1]=11,bucket[index]值减1(由于此位对应的元素已经有一个拍好了顺序)
int index = (temp[j] / rate) % radix;
data[--bucket[index]] = temp[j];
}
//一次循环过后我们可以看到data数组变为20,11,4,5,15,我们可以看到个位数字较大的数排到了较后
//接着rate乘以10并对十位进行相应排序
rate *= radix;
}
}
private static void sortArrayDesc(int[] data, int radix, int d) {
int[] temp = new int[data.length];
int[] bucket = new int[radix];
int rate = 1;
for (int i = 0; i < d; i++) {
System.arraycopy(data, 0, temp, 0, data.length);
Arrays.fill(bucket, 0);
for (int j = 0; j < data.length; j++) {
int index = (temp[j] / rate) % radix;
//降序排序最大的特点就是将位数较大的元素出现次数放在了前面
bucket[9 - index] += 1;
}
for (int j = 1; j < bucket.length; j++) {
bucket[j] = bucket[j] + bucket[j - 1];
}
for (int j = data.length - 1; j >= 0; j--) {
int index = (temp[j] / rate) % radix;
data[--bucket[9 - index]] = temp[j];
}
rate *= radix;
}
}
private static void printArray(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
}
}
分享到:
相关推荐
Java 基数排序 排序 算法 数据结构 数组 输出
基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,需要将关键字拆分成数字位。并且按照数字位的值对数据项进行排序,这种方法不需要进行比较操作。 为了尽可能少的...
算法与数据结构,Java基数排序,归并排序,利用栈将四则表达式中缀转换为后缀并计算_Arithmetic
基数排序及优化java
Java 基数排序算法详解 基数排序(Radix Sort)是一种非比较排序算法,它的基本思想是将待排序的数组按照位数(个位、十位、百位)进行划分,然后依次对每个位上的数字进行排序,最终得到有序的数组。基数排序的...
自己写的插入排序,随机产生1000次,每次产生0-1000个数,验证算法正确性。java实现。
以下是一个简单的Java基数排序代码示例: ```java public class RadixSort { private static final int RADIX = 10; // 基数,这里为10进制 public static void radixSort(int[] nums) { int maxNum = Arrays....
Java基数排序Radix Sort原理及用法解析 Java基数排序Radix Sort是一种高效的稳定性排序算法, thuộc於“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort。顾名思义,它是通过键值的...
下面我们将详细探讨基数排序的原理和Java实现。 基数排序的基本思想是通过创建多个桶来分配和收集元素。每个桶对应一个特定的数值范围,这些桶按照数值的位数进行,从最低位到最高位。在排序过程中,我们先按最低位...
该资源提供了在Java中如何实现基数排序的全面指南。文档涵盖了基数排序的基本概念,包括如何对数组进行排序以及如何在Java中实现基数排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现基数排序,包括详细...
### Java实现基数排序算法 #### 实现原理 基数排序是一种非常高效的非比较型整数排序算法,它通过按数字的各个位数进行排序来实现序列的整体有序化。该算法的关键在于能够有效地处理多位数,避免了传统的两两比较...
基数排序java代码,望对大家有帮助,谢谢!
下面是一个基于Java语言的基数排序算法实现示例: ```java import java.util.*; class NumNode { byte[] data; NumNode next; NumNode(int ch, NumNode new_node) { int i = 0; data = new byte[10]; // ...
基数排序是根据数字位数进行排序的算法,从最低有效位开始,逐位进行排序。基数排序的时间复杂度为O(d*(n+k)),其中d是数字的最大位数,k是基数。Java实现如下(未给出,需自行实现)。 以上就是Java中实现的一些...
基数排序/桶排序 *统计将数组中的数字分配到桶中后,各个桶中的数字个数 *数组中每个数的每一位数根据大小分配到对应大小为0~9的桶 *将各个桶中的数字个数,转化成各个桶中最后一个数字的下标索引
"Java语言实现基数排序代码分享" 基数排序是非比较排序算法,通过对数字的每个位数进行排序从而实现对整个数字的排序。Java语言实现基数排序代码分享是通过使用基数排序算法来对整数数组进行排序。 1. 基数排序...
例如,插入排序和选择排序适合小规模数据,冒泡排序虽然效率较低但实现简单,堆排序和快速排序在处理大规模数据时有较好性能,而基数排序则能处理非负整数排序。在实际开发中,根据具体需求选择合适的排序算法是非常...
基数排序的关键思想是按照数字的个位、十位、百位等逐个进行计数排序,从最低位到最高位。在每个位上,使用计数排序来稳定地排序数组。通过多次迭代,对所有位进行排序后,最终得到有序的数组。 在示例代码中,我们...
下面是一个简单的Java实现,展示了如何使用基数排序对整数数组进行排序: ```java public class RadixSort { public static void radixSort(int[] arr) { int max = getMax(arr); int exp = 1; while (max / ...