基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。
基数排序可以看成多(单)关键字的排序,可以想象成桶排序那样分桶排序,也可以像计数排序那样归约化分治。
基数排序的思想是将待排序序列中的每组关键字进行桶排序。例如整数序列[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; } } } }
以上代码仅供参考