原理
基数排序是桶排序的升级,桶排序的原理是利用数组的有序性进行排序,但是对存储空间的浪费极大
基数排序只需要10个桶即可(0~9),其原理是对排序元素的每一位进行排序,而非元素本身
其原理很简单,即若位数不同,位数大的一定大于位数小的,若最高位相同则比较次一位
思路
-
将所有元素按照最低位,分别放入桶中,相同位数的值如果相同则放入同一个桶
-
再将桶中的数组取出到数组中,此时得到按照最低位排序的数组
-
按照位次循环上述操作,若元素在某一位上没有值,按0来处理
代码
/**
* 基数排序原理:桶排序的升级,要排序的数最高有多少位就需循环几次,第一次按照个位排序,第二次按照十位排序,依次排序,若有的数没有当前位的数,则视为0
* 其实原理很简单: 若位数不同,位数大的一定大于位数小的,若位数相同则比较最高位,若最高位相同,则比较次一位
* @param arr 数组
* @param n 数组中的数的最高位,即循环次数
* @return
*/
public static int[] radixSort(int[] arr , int n){
// 因为若相同位数上的数相等要放入同一个桶内,最多有arr.length个数的相同位数上的数相等,所以一个桶最多可以放arr.length个数,0~9共有10个数
int temp[][] = new int[arr.length][10];
// 初始化数组,若没有放入数则为-1跳过
for (int i = 0 ; i < arr.length ; i++){
for (int j = 0 ; j < 10 ; j++){
temp[i][j] = -1 ;
}
}
int t = 0 ;
// i代表本次要排序的位数
for (int i = 0 ; i < n ; i++){
for (int j = 0 ; j < arr.length ; j++){
// 若该位置上不为-1,则表示已经放入数了,放入桶的下一个位置
while (temp[t][getNum(arr[j],i)] != -1)
{
t++;
}
temp[t][getNum(arr[j],i)] = arr[j];
t=0;
}
int index = 0;
// 根据桶的顺序对数组进行排序
for (int j = 0 ; j < 10 ; j++){
while (temp[t][j] != -1) {
arr[index] = temp[t][j];
temp[t][j] = -1;
index++;
t++;
}
t=0;
}
t=0;
for (int l = 0 ; l < arr.length ; l++){
System.out.print(arr[l] + " ");
}
System.out.println();
}
return arr;
}
// 取第n位数
public static int getNum(int num , int n){
for (int i = 0 ; i < n ; i++){
num = num/10;
}
num = num % 10;
return num;
}
// 判断位数
public static int judgelen(int num){
int len = 0;
while (num>0){
num = num/10;
len++;
}
return len;
}