基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。
基数排序可以看成多(单)关键字的排序,可以想象成桶排序那样分桶排序,也可以像计数排序那样归约化分治。
基数排序的思想是将待排序序列中的每组关键字进行桶排序。例如整数序列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]上每个位、十位和百位上的数字看成是一个关键字。
源码
package com;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner (System.in);
int n=s.nextInt();
int [] a=new int [n];
for(int i=0;i<n;i++)
a[i]=(int)(Math.random()*100);
radixsort(a);
System.out.println(Arrays.toString(a));
}
public static void radixsort (int[] a) {
int max=a[0];
for(int i=1;i<a.length;i++) {
if(a[i]>max)
max=a[i];
}
int maxLength=(max+"").length();
int [][] bucket=new int [10][a.length];
int [] bucketCount=new int [10];
for(int k=0,n=1;k<maxLength;k++,n*=10) {
for(int i=0;i<a.length;i++) {
int dight=a[i]/n%10;
bucket[dight][bucketCount[dight]]=a[i];
bucketCount[dight]++;
}
int index=0;
for(int i=0;i<10;i++) {
if(bucketCount[i]!=0) {
for(int j=0;j<bucketCount[i];j++) {
a[index]=bucket[i][j];
index++;
}
}
bucketCount[i]=0;
}
}
}
}
以上代码仅供参考