2017-12-10 9 views
2
class CountingSort { 

    int[] csort(int[] arr) { 
     int n = arr.length; 
     int max = arr[0]; 
     int[] out = new int[n]; 
     for (int i : arr) { 
      if (max < i) { 
       max = i; 
      } 
     } 
     int range = max + 1; 
     int[] te = new int[range]; 
     for (int i = 0; i < range; ++i) { 
      te[i] = 0; 
     } 
     for (int j = 1; j < n; j++) { 
      te[arr[j]] = te[arr[j]] + 1; 
     } 
     // case1: {0,0,0,1,0,1,1,0,1,1} 
     // case2: {0,0,0,1,0,1,1,0,1,1} 
     for (int k = 1; k < range; ++k) { 
      te[k] = te[k] + te[k - 1]; 
     } 
     // case1: {0,0,0,1,1,2,3,3,4,5} 
     // case2: {0,0,0,1,1,2,3,3,4,5} 
     for (int l = n - 1; l >= 0; --l) { 
      out[te[arr[l]]] = arr[l]; 
      te[arr[l]] = te[arr[l]] - 1; 
     } 
     return out; 
    } 

} 

위의 코드는 정렬 계산을위한 코드입니다. 다음 나의 관찰은분류 Java 계산 - 예기치 않은 결과

  1. 가 최소가 첫 번째 요소의 예 {1, 6, 8, 3, 5, 9}되도록 입력 배열이 예상 출력을 {1, 3, 5, 6, 8, 9}
  2. 을 제공하지만 입력 배열을 주면 첫 번째 요소는 다음 출력 작은 예를 들어 {4, 6, 8, 3, 5, 9}되지 않도록 있습니다 첫 번째 요소는 0이고 한 숫자는 누락됩니다. 시도했지만 어떻게 이런 일이 있는지 찾을 수 없습니다.
+1

합니다. 코드를 단계별로 실행하고 원하는 변수가없는 변수를 확인합니다. – Pshemo

답변

3

발생 횟수 계산을위한 루프가 모든 요소를 ​​반복하지 않으므로 arr[0]을 건너 뜁니다.

for (int j = 0; j < n; j++) { 
    te[arr[j]] = te[arr[j]] + 1; 
} 

게다가, 당신은 더 많은 "우아한"방법을 쓸 수있다 : 디버거를 사용하는 방법을 배울 수있는 좋은 기회처럼 보이는

for (int j = 0; j < n; ++te[arr[j]], ++j); 
+1

출력을 내보내는 동안 [te [arr [l]] - 1] = arr [l]; – magpie