用C ++计算排序

时间:2019-01-24 16:26:43

标签: c++ sorting counting-sort

我试图在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;
}

1 个答案:

答案 0 :(得分:3)

看起来您在正确的轨道上。您将输入输入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;
}

在第一个迭代中,第一个循环总是越界(C[i-1]是不确定行为时,i=0),但是即使不是这样,我也不确定介意这里。或者在那之后的循环中。

相反,如果我是您,我将创建一个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