基数排序
将一个一维数组从大到小排列。基数排序是桶排序的扩展。它是一种稳定的排序方法,也就是说,排序之前相同大小的数字的位置次序在排序后并没有发生改变。同时,基数排序是一种用空间换时间的排序方法,当数据量过大时,java的堆内存耗尽,方法就不能使用了。
思路
基数排序的思路是:首先创建10个桶(二维数组),然后依次遍历原数组,取每一个数的个位数,并按个位数的大小放入桶中,比如5就放在下标为5的桶,17就放在下标为7的桶,729就放在下标为9的桶。遍历结束后,在按照顺序从桶中取出数据放回到原数组,也就是遍历桶,取出数据,放入原数组。第二次,取每个数的十位重复操作,没有十位的数认为十位是0,第三次取百位,一直取原数组中最大数的长度次,此时就排列完毕。
需要注意的是,不能排列负数。
代码
private static void radixSort(int[] arr){
//按位存放数字
int[][] bucket=new int[10][arr.length];
//存放数字的个数
int[] bucketCount=new int[10];
int max=arr[0];
for (int i = 0; i <arr.length ; i++) {
if(arr[i]>max){
max=arr[i];
}
}
int maxLength=(max+"").length();
for (int i = 0,n=1; i <maxLength ; i++,n=n*10) {
//按位存数据
for (int j = 0; j <arr.length ; j++) {
int digth=arr[j] / n % 10;
bucket[digth][bucketCount[digth]]=arr[j];
bucketCount[digth]++;
}
//按位取数据
int index=0;
for (int k = 0; k <10 ; k++) {
if(bucketCount[k]!=0) {
for (int l = 0; l < bucketCount[k]; l++) {
arr[index++]=bucket[k][l];
}
}
//还原
bucketCount[k]=0;
}
}
}