基数排序:即把要排序的数(正整数)的每个数从低位到高位依次排一次序,最后全数组即为有序。
具体方法是初始化编号0-9的 10个桶(每位数字只可能是0-9),每次把当前位为0-9的数分别放入各桶内,然后按顺序在恢复到原数组,再进行下一位的排序,如此反复,直到到最高位为止
比如如下数字 111, 321, 322, 711, 58, 646, 35, 9
先按个位排序
桶编号
0
1------ 111 321 711
2------ 322
3------
4
5------ 035
6------ 646
7
8------ 058
9------ 009
恢复到原数组为 111 321 711 322 35 646 58 9
再按十位排序
桶编号
0------ 009
1------ 111 711
2------ 321 322
3------ 035
4------ 646
5------ 058
6------
7
8------
9------
恢复到原数组为 9 111 711 321 322 35 646 58
再按百位排序
桶编号
0------ 009 035 058
1------ 111
2------
3------ 321 322
4------
5------
6------ 646
7------ 711
8------
9------
恢复到原数组为 9 35 58 111 321 322 646 711 至此,全数组有序
import java.util.ArrayList;
public class RadixSort
{
ArrayList<Integer>[] bucket;
@SuppressWarnings("unchecked")
public void InitBucket()
{
bucket = new ArrayList[10];//init the bucket
for(int i = 0 ; i < 10 ; i++)
{
bucket[i] = new ArrayList<Integer>(); //初始化每个桶
}
}
/**
* 将数据放入桶内筛选后在放回数组
* @param a 数组a
* @param rate 最大位数,1,10,100,1000.。。。
*/
public void PushToBucket(int a[], int rate)
{
int k ,weight = 1;
while(true)
{
k = 0;
InitBucket();
if(weight > rate)
break;//终止条件
for(int i = 0 ; i < a.length ; i++)
{
int lowbit = a[i]/weight%10;//获取某位的数字 0-9
bucket[lowbit].add(a[i]); //放入相应的bucket内
}
for(int i = 0 ; i < 10 ; i++) //从桶内回收数据
{
for(int e : bucket[i])
{
a[k++] = e;
}
}
weight *= 10;
}
}
/**
* 基数排序
* @param a 数组a
* @param d 最大数字为几位数
*/
public void Radix_sort(int a[], int d)
{
int rate = (int) Math.pow(10, d-1); //统计最大位数
PushToBucket(a,rate);
}
/**
* @param args
*/
public static void main(String[] args)
{
int a[] = { 111, 321, 322, 711, 58, 646, 35, 9 };
RadixSort test = new RadixSort();
test.Radix_sort(a,3);
for (int i = 0; i <= 7; i++)
{
System.out.print(a[i] + " ");
}
}
}