2013-02-28 2 views
0

지금은 기수 정렬을 구현하는 기수 정렬 작업을하고 있습니다. 나는 대부분 이해하고 의사 코드를 따랐다 생각하지만, 나는 경계 오류에서 배열을 얻고있다 :기수 정렬 및 개수 정렬

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

내 코드 당신은 J를 증가하지 않는

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; 
    } 
} 

답변

1

.

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

이 시도 : 이것은 오타 될 수 for(int j = 0; j < d; i++){

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

또한

, 라인이어야 라인에

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

그래, 내가 위에 게시 한 범위를 벗어난 오류로 돌아 왔습니다. – shinjuo

+0

어느 라인이 47입니까? –

+0

죄송합니다 여기에 (int m = 0; m shinjuo

0

C[A[k]] = C[A[k]] + 1; 경우 K = 8 A [K] = 23 ArrayOutOfBoundsException을 얻으려고합니다. 왜냐하면 C []가 선언되었을 때 파일의 배열로 선언되어 있기 때문입니다 ngth 23은 0에서 22까지의 색인 만 가능합니다. 실제 값 범위에는 0에서 최대 값까지를 포함해야합니다.

따라서 C []를 int[] C = new int[d+1];으로 선언하거나 입력 배열 sortNumbers에서 허용되는 값을 0으로 간주하는지 여부에 따라 C[A[k]-1] = C[A[k]-1] + 1;의 값으로 저장해야합니다.

그러나 질문과 코드가 변경되었습니다. 코드 블록은 값을 합산 점점 어레이 B의 인덱스 그러나 B가 인으로

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

배열 C의 항목의 값을 사용 그런 배열 C.

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

다음 블록로 추가 배열 A와 크기가 같아야합니다.

C는 값의 합계 대신 총 값을 보유해야합니까?