前面的计数排序是基数排序的基础,思想是按照多个关键字(桶)对元素进行多轮的计数排序
例如对三位数排序时,首先根据个位数进行计数排序,然后十位数,最后根据百分数,最后得到有序的序列
import java.util.Arrays;
//基数排序,以对三位数为例
public class RadixSort {
public static void main(String[] args) {
int arr[] = {421,240,115,532,305,430,889,776,225};
System.out.println("数组为:");
System.out.println(Arrays.toString(arr));
arr = Radix_Sort(arr,3);
System.out.println("排序后为:");
System.out.println(Arrays.toString(arr));
}
//针对三位数,按每个元素的个位数,十位数,百位数大小分别进行一次计数排序,共三次
//一个数字任何一位上的大小值为0-9,所以k表示0到9,计数数组C下标为0到9
//对n个d位数进行基数排序
public static int[] Radix_Sort(int[] A,int d) {
int[] B = new int[A.length];//结果数组
int[] C = new int[10];//计数数组,范围为每位上的取值范围0-9
//一个十进制数m,它的个位数是m/1%10,十位数是m/10%10,百位数是m/100%10
for(int i=0;i<d;i++) {
int division = (int)Math.pow(10, i);//取个位::/1 十位:/10 百位:/100中的基本划分点
for(int j=0;j<A.length;j++) {
int num = A[j]/division%10;//取个位 十位 或百位上的数,每轮由此位置上的数大小进行计数排序
C[num]=C[num]+1;//进行计数排序中计数数组的更新
}
//计数排序中计数数组count的累加,保证稳定性
for(int m=1;m<C.length;m++) {
C[m]=C[m]+C[m-1];
}
//计数排序中逆序遍历原数组A,根据累加后的数组count将A中每个元素正确填入result中正确的位置中
for(int j=A.length-1;j>=0;j--) {
int num = A[j]/division%10;
B[C[num]-1]=A[j];
C[num]=C[num]-1;
}
//将数组A更新为数组B
for(int j=0;j<A.length;j++) {
A[j]=B[j];
}
//将数组C清零,进行下一轮的循环
for(int j=0;j<C.length;j++) {
C[j]=0;
}
}
return A;
}
}
测试结果: