public void radix_sort(int[] src){
        //取最大值
        int max = src[0];
        for (int i = 0; i < src.length; i++) {
            max = src[i] > max ? src[i] : max;
        }
        //取最大值的位数
        int w = 0;
        while (max>0){
            max/=10;
            w++;
        }
        //创建十个队列,用二维数组模拟
        int[][] bkt = new int[10][src.length];

        //记录每个bkt队列中有几个src元素
        int[] cm = new int[10];

        for (int i = 0; i < w; i++) {
            //遍历元素，按元素的第i位数值分类排放
            for (int j = 0; j < src.length; j++) {
                int item = src[j];
                //求src中第j(从0开始)个元素的第i(从0开始)位数字
                //例如987的第1位数字是(987%100)/10
                int l = (item % (int)Math.pow(10,i+1))/(int)Math.pow(10,i);
                //bkt第l个队列可能有多个数据,用现有的数量表示位置
                bkt[l][cm[l]] = item;
                //位置后移1位
                cm[l] += 1;
            }
            //重新取出放回src
            //记录已经取出的个数
            int count = 0;
            for (int j = 0; j < 10; j++) {
                //第i位为j的元素的个数
                int cml = cm[j];
                while (cm[j] > 0){
                    //j从小到大递增,这样取数据将使src具有递增趋势
                    //将这样的元素存入bkt,将使bkt中每个队列都具有递增趋势
                    //为了不破换这样的趋势,将需要从每个bkt队列的开头开始取数据
                    src[count] = bkt[j][cml-cm[j]];
                    //减去一个元素
                    cm[j] -= 1;
                    count++;
                }
            }
        }
    }