我现在正在研究实现计数排序的基数排序。我认为我在大多数情况下理解并遵循伪代码,但我得到一个数组越界错误:
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;
}
}
答案 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应该保留值的总和而不是值的出现总数吗?