簡體   English   中英

用C ++計算排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM