基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
步骤:
1、建立10个数组:0,1,2,3,4,5,6,7,8,9
2、第一次按个位排放入数组,再以数组号从小到大取出来
3、第二次按十位排放入数组,再以数组号从小到大取出来
4、··········
注意:排序的次数取决于最大的数有几位。
java实现源码:
package myself;
import java.util.Arrays;
public class RodixSort {
public static void main(String[] args) {
int a[]= {789,15,2,1,59,2668,595,32985,326,596,59,9,369,56,89,159,753,489};
rodixSort(a);
System.out.println(Arrays.toString(a));
}
public static void rodixSort(int a[]) {
//找出数组中最大的数字
int max=Integer.MAX_VALUE;
for(int i=0;i<a.length;i++) {
if(a[i]>max) {
max=a[i];
}
}
//计算最大数字是几位数
int maxLength=(max+"").length();
//用于临时存储数据的数组
int temp[][]=new int[10][a.length];
//用于记录在temp中相应的数组中存放的数字数量
int counts[]=new int[10];
//根据最大长度的数决定比较的次数
for(int i=0,n=1;i<maxLength;i++,n*=10) {
//把每一个数分别计算余数
for(int j=0;j<a.length;j++) {
//计算余数
int ys=a[j]/n%10;
//把当前遍历的数据放入指定的数据中
temp[ys][counts[ys]]=a[j];
//记录数量
counts[ys]++;
}
//记录取得元素需要放的位置
int index=0;
//把数字取出来
for(int k=0;k<counts.length;k++) {
//记录数量的数组中当前余数记录的数量不为0
if(counts[k]!=0) {
//循环取出数组
for(int l=0;l<counts[k];l++) {
//取出元素
a[index]=temp[k][l];
//记录下一个位置
index++;
}
//把数量置为0
counts[k]=0;
}
}
}
}
}
其实不难发现,基数排序在从对应数组中取数的时候是先进先出,和队列进出的形式是一样的,所以也可以通过队列形式做基数排序。