[英]Counting Sort in C++
我正在嘗試在C ++中實現計數排序而不創建函數。 這是我到目前為止編寫的代碼,但是該程序未向我返回任何值。 它也沒有給我任何錯誤。 因此,出什么問題了?
#include <iostream>
using namespace std;
int main()
{
int A[100], B[100], C[100], i, j, k = 0, n;
cin >> n;
for (i = 0; i < n; ++i)
{
cin >> A[i];
}
for (i = 0; i < n; ++i)
{
if (A[i] > k)
{
k = A[i];
}
}
for (i = 0; i < k + 1; ++i)
{
C[i] = 0;
}
for (j = 0; j < n; ++j)
{
C[A[j]]++;
}
for (i = 0; i < k; ++i)
{
C[i] += C[i - 1];
}
for (j = n; j > 0; --j)
{
B[C[A[j]]] = A[j];
C[A[j]] -= 1;
}
for (i = 0; i < n; ++i)
{
cout << B[i] << " ";
}
return 0;
}
看來您在正確的軌道上。 您將輸入輸入A
,找到將要處理的最大值,然后確保將C
數組中的多個值歸零。 但這就是開始出錯的時候。 然后,您執行以下操作:
for (i = 0; i < k; ++i)
{
C[i] += C[i - 1];
}
for (j = n; j > 0; --j)
{
B[C[A[j]]] = A[j];
C[A[j]] -= 1;
}
該第一個循環將始終超出第一次迭代的范圍(當i=0
時, C[i-1]
將是未定義的行為),但是即使不是這樣,我也不確定您在這里的想法。 或者在那之后的循環中。
相反,如果我是您,我將創建一個indx
變量來跟蹤接下來要插入數字的索引(到目前為止已插入多少個數字),然后循環遍歷C
對於C
每個值,我將循環多次並插入該索引的多個值。 我的解釋聽起來有些羅word,但這看起來像:
int indx = 0;
for(int x = 0; x <= k; x++) {
for(int y = 0; y < C[x]; y++) {
B[indx++] = x;
}
}
如果您用此循環替換上面的兩個循環,那么一切都會按預期進行。
在此處查看實時示例: ideone
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.