09基数排序

35 阅读1分钟

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;
    }
}