数据结构与算法之基数排序

这真的是一个很秒的算法,具体都在代码注释中,第一次根据个位数字排序,然后再取出,再根据十位数字排序,再取出,依次类推,循环次数取决于待排序数组中最大数字的位数

package 基数排序;

import java.util.Arrays;

public class fundamental_math_sort {
    public static void main(String[] args) {
        int[] test = {1,25,3,54,895,226,15,485,235,48,145};
        sort(test);
        System.out.println(Arrays.toString(test));
    }
    public static void sort(int[] arr){
        int max= arr[0];//设置一个最大的数字,确定位数
        for (int i = 1; i <arr.length ; i++) {
            if (arr[i]>max){
                max=arr[i];
            }
        }
        int [][] temp = new int[10][arr.length];//用于存放临时数组
        int [] count =new int[10];//用于记录二维数组中每个位置放入的数字
        int maxlength = (max+"").length();//确定最大数字是几位数
        for (int i = 0,n=1; i <=maxlength ; i++,n*=10) {//第一次循环取个位,第二次循环取百位,//开始放入
            for (int j = 0; j <arr.length ; j++) {
                int remainder = arr[j]/n%10;//计算余数是多少,
                //放入到对应的数组中,其中第一个有余数确定,也就是余数是几,放到第几行,
                //第二个位置由记录的数字确定,如果是第一次放入,记录的应该是0,那么放置的位置是第一个位置,然后count[remainder++]
                temp[remainder][count[remainder]]=arr[j];
                //使记录的数组对应位置++
                count[remainder]++;

            }
            //第一次放入的结果,打印第一次放置的结果
//            if (i==0){
//                for (int[] nums:temp){//
//                    for (int data:nums){
//                        System.out.printf("%d\t",data);
//                    }
//                    System.out.println();
//                }
//                System.out.println(Arrays.toString(count));//打印记录的数组
//            }
            //记录取出的数字需要放的位置
            int index =0;
            //取出数字,循环记录的数组每个位置
            for (int k = 0; k <count.length ; k++) {
                if (count[k]!=0) {//如果记录的数量不为零说明有数字
                    //遍历取出数字
                    for (int p = 0; p < count[k]; p++) {
                        arr[index] = temp[k][p];//取回到原数组
                        index++;
                    }
                    count[k]=0;//把记录的数组重置为0
                }
            }
        }



    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值