2011-10-02 78 views
0

這裏計數是代碼計數排序執行排序

#include <iostream> 
using namespace std; 

int main(){ 
    int a[]={2,3,1,2,3}; 
    int n=sizeof(int)/sizeof(int); 
    int max=a[0]; 
    for (int i=1;i<n;i++) { 
     if (a[i]>max) { 
      max=a[i]; 
     } 
    } 

    int *output=new int[n]; 
    for (int i=0;i<n;i++) { 
     output[i]=0; 
    } 
    int *temp=new int[max+1]; 
    for (int i=0;i<max+1;i++) { 
     temp[i]=0; 
    } 
    for (int i=0;i<n;i++){ 
     temp[a[i]]=temp[a[i]]+1; 
    } 
    for (int i=1;i<max+1;i++) { 
     temp[i]=temp[i]+temp[i-1]; 
    } 
    for (int i=n-1;i>=0;i--) { 
     output[temp[a[i]]-1]=a[i]; 
     temp[a[i]]=temp[a[i]]-1; 
    } 
    for (int i=0;i<n;i++) { 
     cout<<output[i]<<" "; 
    } 
    return 0; 
} 

但產量僅2中,只有一個號碼。怎麼了我不明白請大家幫幫我

+0

真是一團糟。我爲你格式化了你的代碼。 – abelenky

+0

爲什麼不在出口刪除數組? – Deqing

+0

'int n = sizeof(int)/ sizeof(int);'應該是int n = sizeof(a)/ sizeof(* a);' –

回答

2
int n=sizeof(int)/sizeof(int); 

是錯的。那只是1n

你的意思是

int n=sizeof(a)/sizeof(int); 

我沒有看不止於此。毫無疑問還有更多的問題,但這是最重要的。

這是你可以用調試器輕鬆搞定的東西。

+1

...或者甚至有一些明智的打印語句。 –

+0

@Greg他們甚至不需要明智地安置! ;-) –

+0

我認爲你應該建議**'const' **'int n = sizeof(a)/ sizeof(int)'而不是:) – sehe

1

看看這個表情:

int n=sizeof(int)/sizeof(int); 

你怎麼看的n值後呢? (1)
這是合適的值嗎? (不,值應該是5)
這是否解釋了您所看到的輸出? (是的,這可以解釋爲什麼只顯示了一個數字)

+0

是的,我明白了,它只是錯字感謝大家的幫助 –

+0

@ user466534,更大的擔憂是你無法自己調試。這表明您沒有在調試器中逐句通過您的代碼,並且無法找到能夠讓您找到正確答案的問題和答案。 大家都做錯別字。好的程序員有能力診斷錯別字。 – abelenky

+0

不,首先你是正確的,好的程序員有技能來診斷錯別字,只是我很累,不能想到這樣最簡單的錯誤,但感謝您的建議 –

1

我的建議是,如果你要做到這一點在C++中,你真正嘗試使用什麼用C的可用++做到這一點。我會查找std::max_element以查找輸入中最大的元素,並使用std::vector而不是直接混淆動態分配。

當你想在C++數組中元素的個數,你可能會考慮一個函數模板是這樣的:

template <class T, size_t N> 
size_t num_elements(T const (&x)[N]) { 
    return N; 
} 

一切傾倒main相反的,我還寫計數排序爲一個單獨的函數(或者更好,一個函數模板,但我現在只保留這一點)。

// warning: Untested code: 
void counting_sort(int *input, size_t num_elements) { 
    size_t max = *std::max_element(input, input+num_elements); 

    // allocate space for the counts. 
    // automatically initializes contents to 0 
    std::vector<size_t> counts(max+1); 

    // do the counting sort itself. 
    for (int i=0; i<num_elements; i++) 
     ++counts[input[i]]; 

    // write out the result. 
    for (int i=0; i<counts.size(); i++) 
     // also consider `std::fill_n` here. 
     for (int j=0; j<counts[i]; j++) 
      std::cout << i << "\t"; 
} 

int main() { 
    int a[]={2,3,1,2,3}; 

    counting_sort(a, num_elements(a)); 
    return 0; 
} 
+0

我會考慮將來,謝謝@Jerry Coffin –