09基数排序
基本思想:从个位到最高位,依次比较大小并装入顺序数组再顺序输出,重复此步骤。
讲解:
//设置临时数组大小
final static int MAX = 20;
//设置关键字基数,十进制
final static int BASE = 10;
//创建一个名为Radix_sort的方法,传入待排数组a及其大小len
public static void Radix_sort(int a[],int len){
//定义临时数组b,大小为MAX
int[] b = new int[MAX];
//定义变量m为原数组首元素a[0],exp为除数
int m = a[0],exp = 1;
//遍历1 ~ len个元素,寻找数组中的最大值
for(int i = 1;i < len;i++){
//依次判断当前元素是否大于首元素,若大于
if(a[i] > m){
//则将m更新为当前的a[i]
m = a[i];
}
}
//遍历结束后,m中保存数组中最大值
//循环条件:最大值元素 / exp 始终大于0,计算最多可遍历的次数
while(m / exp > 0){
//新建一个数组bucket,大小为BASE
int[] bucket = new int[BASE];
//遍历所有元素
for(int i = 0;i < len;i++){
//将每一个元素的最高位取出,并在bucket数组中对应位置+1
bucket[(a[i] / exp) % BASE]++;
}
//遍历整个数组1 ~ BASE
for(int i = 1;i < BASE;i++){
//更新bucket的值为 : 当前bucket的值 + 当前的前一个bucket的值
bucket[i] += bucket[i - 1];
}
//从后向前遍历所有元素
for(int i = len - 1;i >= 0;i--){
//首先计算当前元素的次位数:(a[i] / exp) % BASE
//其次将此bucket的值 - 1
//然后将最终值作为临时数组b的下标,进而将当前元素a[i]赋值给其
b[--bucket[(a[i] / exp) % BASE]] = a[i];
}
//遍历临时数组b中所有元素,将所有元素赋给原数组a
for(int i = 0;i < len;i++){
a[i] = b[i];
}
//每循环一次将除数exp * 10,目的是取出下一位数
exp *= BASE;
}
}