2013-08-25 78 views
-4

我寫這段代碼用於使用計數排序來排序數組的元素。該程序編譯並運行,但沒有給出正確的輸出。我期望元素按非遞減順序排序。我得到的輸出按非遞減順序排序,但值與我輸入的不一樣。我已經多次檢查了代碼,但是我無法發現錯誤。請幫忙。計數排序程序

import java.io.*; 

public class Main { 
public static void main(String aa[]) { 

    try { 
     BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

     int t = Integer.parseInt(input.readLine()); 
     int a [] = new int[t]; 
     int c [] = new int[t]; 
     int max = 0; 

     if(t<=1000000) { 

      for(int i = 0; i<t; i++) { 
       int n = Integer.parseInt(input.readLine()); 
       if(n>=0 && n<=1000000) { 
        a[i] = n; 
        if(n>max) max = n; 
       } 
      } 

      int b[] = new int[max+1]; 

      for(int i = 0; i<max+1; i++) 
       b[i] = 0; 

      for(int i = 0; i<t; i++) 
       b[a[i]] += 1; 

      for(int i = 1; i<max+1; i++) 
       b[i] += b[i-1]; 

      for (int i = t-1; i>=0; i--) { 
       c[b[a[i]]] = a[i]; 
       b[a[i]]--; 
      } 

      for (int i = 0; i<t; i++) 
       System.out.println(c[i]); 

     } 
     else 
      System.exit(0); 
    } catch (Exception e) {System.out.println(e);} 
    } 
} 
+3

你期望什麼?它真的給了你什麼? –

+1

嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後如有必要,你應該構造一個[最小測試用例](http://sscce.org)。) –

+0

@JeroenIngelbrecht我期望元素按非遞減順序排序。我得到的輸出按非遞減順序排序,但值與我輸入的不一樣。 –

回答

3

你是對的地方你錯了。更改:

for (int i = t-1; i>=0; i--) { 
    c[b[a[i]]] = a[i]; 
    b[a[i]]--; 
} 

到:

for (int i = 0; i<t; ++i) { 
    c[b[a[i]]-1] = a[i]; 
    --b[a[i]]; 
} 

,它應該工作的罰款您的測試數據。

+0

它的工作!非常感謝!我很高興至少有人打擾回答這個問題。 –

2

你幾乎說得對。更改以下行(關閉一個錯誤)

for (int i = 0; i < t; i++) { 
    c[b[a[i]] - 1] = a[i]; 
    b[a[i]]--; 
} 
+0

Thnaks!我感謝您的幫助。 –