RadixSort 算法运行时间

Posted

技术标签:

【中文标题】RadixSort 算法运行时间【英文标题】:RadixSort algorithm run time 【发布时间】:2016-10-02 15:14:33 【问题描述】:

所以我有一个任务,我必须对大量随机生成的列表运行不同的排序算法。然后,我必须提交一份比较各种算法运行时间的报告。到目前为止,我已经编写了 3 种排序算法的代码:快速排序、归并排序和堆排序。我只剩下基数排序了。下面是代码。这段代码在这一行向我抛出了 ArrayIndexOutOfBoundsException:

b[--bucket[(a[i] / exp) % 10]] = a[i];

但我不太清楚如何更改代码以使其正确。

public class RadixSort 

    public static void main(String[] args) 
        Random generator = new Random( System.currentTimeMillis() );
        Scanner scan = new Scanner(System.in);
        int size = scan.nextInt();
        int[] x = new int[size];

        long start = System.currentTimeMillis();

        for (int i = 0; i < size; i++)
            x[i] = getRandomNumberInRange(0, 100);

        radixSort(x);
        System.out.println(Arrays.toString(x));
        long runtime = System.currentTimeMillis() - start;
        System.out.println("Runtime: " + runtime);
        

    private static int getRandomNumberInRange(int min, int max) 
        if (min >= max)
            throw new IllegalArgumentException("max must be greater than min");

        return (int)(Math.random() * ((max - min) + 1)) + min;
    

    public static void radixSort( int[] a) 
        int i, m = a[0], exp = 1, n = a.length;
        int[] b = new int[10];

        for (i = 1; i < n; i++)
            if (a[i] > m)
                m = a[i];

        while (m / exp > 0) 
            int[] bucket = new int[10];

            for (i = 0; i < n; i++)
                bucket[(a[i] / exp) % 10]++;
            for (i = 1; i < 10; i++)
                bucket[i] += bucket[i - 1];
            for (i = n - 1; i >= 0; i--)
                b[--bucket[(a[i] / exp) % 10]] = a[i];
            for (i = 0; i < n; i++)
                a[i] = b[i];
            exp *= 10;        
        
        

【问题讨论】:

这不是基数排序的工作原理。每个桶都应该包含一个整数数组,然后在主数组中为每个数字重新组合。 我不想提供整个解决方案,以便您可以更好地学习。但这是提示:您的存储桶应声明为 ArrayList[10] 存储桶;在 buckets[digit] 中,您必须放置除以 exp 得出最后一位数字的数字。 你也可以保留你的解决方案,但你必须给 b 数组一个等于 a.length 的大小 【参考方案1】:

这是因为您明确定义了 int[] b 数组的固定大小:

int[] b = new int[10];

这就是输入大于10时溢出的原因。

将其从参数更改为数组的可变长度。

int[] b = new int[a.length];

此外,我建议您修复仅在区间 (0; n&gt; 内获取数字输入的问题。

【讨论】:

以上是关于RadixSort 算法运行时间的主要内容,如果未能解决你的问题,请参考以下文章

排序算法----基数排序(RadixSort(L))单链表智能版本

排序算法----基数排序(RadixSort(L,max))单链表版本

订购 n 个数字的最佳运行时间

基数排序(radixSort)

基数排序 RadixSort

数据结构实验四 Radix Sort And Stack