package org.hongjn.algorithm.sort;
import java.util.Arrays;
/**
* 基数排序Java实现
* @date 2011-10-19
*/
public class RadixSort {
/**
*
* @param data 待排序数组
* @param digitNum 数组中元素的位次
*/
public static int[] sort(int[] data) {
// 取得数组中最大的元素
int maxElement = 0;
for (int element : data) {
if (element > maxElement) {
maxElement = element;
}
}
String maxElementStr = String.valueOf(maxElement);
// 计算数组中最大元素的位数
int digitNum = maxElementStr.length();
// 从最低位开始,按照其基数radix进行排序
for (int i = 1; i <= digitNum; i++) {
// 根据基数的范围构建临时数组
int[] tmp = new int[10]; // 十进制数,基数0-9共十个
for (int element : data) {
int radix = getRadix(element, i); // 取得元素第i位上的基数
++tmp[radix]; // 对于基数radix相同的,在数组tmp中累积相加
}
// 此处,计算数组tmp中小于等于基数j的个数
for (int j = 1; j < tmp.length; j++) {
tmp[j] = tmp[j] + tmp[j - 1];
}
int[] result = new int[data.length]; // 存储每次排序的结果
// 遍历数组,排序
for (int k = data.length - 1; k >= 0; k--) {
// 对于遍历到的每个元素,取得第k位的基数radix
int radix = getRadix(data[k], i);
// 根据基数在tmp数组中的位置,确定该元素在数组result中的位置
result[--tmp[radix]] = data[k];
}
// 将result的数据拷贝回data,继续循环
data = Arrays.copyOf(result, result.length);
}
return data;
}
// 求得数组num的第d位的基数
private static int getRadix(int num, int d) {
return (int) (num / Math.pow(10, d - 1)) % 10;
}
}
基数排序Radix Sort
最新推荐文章于 2024-06-22 11:45:35 发布