基数排序和计数排序

时间:2013-02-28 20:40:59

标签: java count radix-sort

我现在正在研究实现计数排序的基数排序。我认为我在大多数情况下理解并遵循伪代码,但我得到一个数组越界错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12
    at RunRadixSort.radixSort(RunRadixSort.java:47)
    at RunRadixSort.main(RunRadixSort.java:15)

我的代码

import java.text.DecimalFormat;
    import java.util.Arrays;


   import java.text.DecimalFormat;
import java.util.Arrays;


public class RunRadixSort {


    public static void main(String[] args) {

        int[] sortNumbers = {4,5,6,2,3,7,2,1,23,5,13};
        int[] sorted = new int[sortNumbers.length];
        DecimalFormat df = new DecimalFormat("#.########");
        int max = getMax(sortNumbers);
        long timeStart = System.nanoTime();
        sorted = radixSort(sortNumbers, max);
        long timeEnd = System.nanoTime();
        long elapsedTime = timeEnd - timeStart;
        double time = (double)elapsedTime / 1000000;
        System.out.println(Arrays.toString(sorted));
        System.out.println("\nTotal Execution Time: " + df.format(time)+ " miliseconds");
    }

    public static int getMax(int[] A){
        int max = A[0];
        for(int i = 1; i < A.length; i++){
            if(A[i] > max){
                max = A[i];
            }
        }
        return max;
    }

    public static int[] radixSort(int[] A, int d){
        int[] B = new int[A.length];
        int[] C = new int[d + 1];
        for(int i = 0; i < d; i++){
            for(int k = 0; k < A.length; k++){
                C[A[k]]++;
            }
            int total = 0;
            for(int l = 0; l < d; l++){
                int temp = C[l];
                C[l] = total;
                total += temp;
            }
            for(int m = 0; m < A.length; m++){
                B[C[A[m]]] = A[m];
                C[A[m]]++;
            }
        }
        return B;
    }
}

2 个答案:

答案 0 :(得分:1)

你没有递增j。这可能是一个错字:

 for(int j = 0; j < d; i++){

试试这个:

for(int j = 0; j < d; j++){

答案 1 :(得分:0)

for(int j = 0; j < d; i++){

应为for(int j = 0; j < d; j++){

另外,  行C[A[k]] = C[A[k]] + 1;当k = 8且A [K] = 23时,你将得到一个ArrayOutOfBoundsException,因为当声明C []时,它被声明为长度为23的数组,你只能将其从0索引到22包容。实际值范围应包括0到最大值。

因此,您需要将C []声明为int[] C = new int[d+1];或存储到值中  C[A[k]-1] = C[A[k]-1] + 1;,取决于您是否在输入数组sortNumbers中将零视为可接受的值。

然而,问题和代码发生了变化。这段代码对值进行求和,并逐渐将它们添加到Array C中。

  for(int l = 0; l < d; l++){
            int temp = C[l];
            C[l] = total;
            total += temp;
        }

然后是下一个块

 for(int m = 0; m < A.length; m++){
            B[C[A[m]]] = A[m];
            C[A[m]]++;
        }

使用数组C中的条目值作为数组B中的索引,但B与数组A的大小相同。

你确定C应该保留值的总和而不是值的出现总数吗?