基数排序:
基数排序通常用作多关键字排序,比如一副扑克牌既要通过花色进行排序也要通过点数对其进行排序。
基数排序分类:
分为高位优先排序和低位优先排序两种
时间复杂度
O(d(n+rd))
空间复杂度
O(d(n+rd))
实现思路:
通过链表的形式来进行实现,原数组存储到主链表中去,每个基数的范围创建一个新的链表,对当前所要比较的位数进行循环比较然后在放入到相应的子链表中去,最后把自链表中的元素赋值到主链表中。
代码:
package 基数排序;
import java.util.LinkedList;
public class RadixSort {
// 存储原数组的链表
private LinkedList<Integer> mainRadix;
// 存储每个基数范围的链表
private LinkedList<Integer>[] subQueue;
@SuppressWarnings("unchecked")
public RadixSort() {
// 初始化原始链表
mainRadix = new LinkedList<Integer>();
// 初始化每个基数值得链表
subQueue = new LinkedList[10];
for (int i = 0; i < 103C/span>; i++) {
subQueue[i] = new LinkedList<Integer>();
}
}
public static void main(String[] args) {
RadixSort rs = new RadixSort();
int[] array = { 24, 52, 63, 7674, 74, 25, 14, 256, 63263, 14, 4, 4242,
52 };
System.out.println("基数排序前");
rs.print(array);
System.out.println("基数排序后");
rs.sort(array);
rs.print(array);
}
public void sort(int[] array) {
int maxDigits = 0;
for (int i = 0; i < array.length; i++) {
// 获取到当前数组中的最长的数字长度 作为高位
if (maxDigits < String.valueOf(array[i]).length()) {
maxDigits = String.valueOf(array[i]).length();
}
// 把数组赋值到链表中
mainRadix.add(array[i]);
}
// 对每一位进行比较判断存入到子链表中去
for (int i = 1; i <= maxDigits; i++) {
// 当原链表中有值时取出分别赋予基数链表
while (mainRadix.size() > 0) {
//取出当前链表中的元素
Integer number = mainRadix.pop();
//转化成字符串便于调用旗下方法好操作
String numberTemp = String.valueOf(number);
//假如当前元素长度判断长度则直接将其塞入到0号链表中去
if (numberTemp.length() < i) {
subQueue[0].add(number);
continue;
}
//当前基数链表序号为当前数的长度减序号处的值减一
//因为数字存入到数组中高位在数组前面 比如 12 1处索引为0索引这么写可以思考一下
int digit = numberTemp.charAt(numberTemp.length() - i) - '0';
//向子链表中插入这个元素
subQueue[digit].add(number);
}
for (int j = 0; j < 10; j++) {
// 把每个子基数给写回原链表
mainRadix.addAll(subQueue[j]);
//并清空每个子基数链表防止下此判断重复
subQueue[j].clear();
}
}
for (int i = 0; i < array.length; i++) {
array[i] = mainRadix.get(i);
}
}
public void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
结果:
基数排序前
24 52 63 7674 74 25 14 256 63263 14 4 4242 52
基数排序后
4 14 14 24 25 52 52 63 74 256 4242 7674 63263