基数排序

China☆狼群 提交于 2020-02-14 21:43:33

在800万数据的时候比希尔 要快 ,比快速 ,归并要快
但是占内存空间过大,8000万,会造成堆溢出,现在写法不能比较负数
需要创建一个二维数组用于排序,一个一位数组用于下标存储。

package a;

import java.util.Arrays;


public class Radix {
    public static void main(String[] args) {
        int var = 8000000;
//        int var = 8;
        int [] arr = new int[var];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random()*900000000);

        }
        long be = System.currentTimeMillis();
//        int [] arr = {53, 3, 542, 748, 14, 214};
        radix(arr);
        long end = System.currentTimeMillis();
        System.out.println(end-be);
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
//        int max = findmaxlength(arr);
    }

    private static int findmaxlength(int[] arr) {
        int res = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (res < arr[i]) {
                res = arr[i];
            }
        }
        res = (res+"").length();
        return res;

    }

    private static void radix(int[] arr) {
        int[][] bucket = new int[10][arr.length];
        int index[] = new int[10];
        for (int j = 0,n=1; j < findmaxlength(arr); j++,n*=10) {

            for (int i = 0; i < arr.length; i++) {//将arr的值放入对应位置
                int end = arr[i] /n % 10;//这个值用于找到桶,也用于找到存储的下标
                bucket[end][index[end]]=arr[i];
                index[end]++;

            }
            int sta=0;
            for (int i = 0; i < bucket.length; i++) {
                if (index[i] != 0) {
                    //因为上面的 ++ ,所以如果有值就是1了
                    for (int k = 0; k < index[i]; k++) {
                        arr[sta++] = bucket[i][k];

                    }
                }
                index[i]=0;
            }
        }


    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!