c++ - C++中的计数排序

标签 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;
}

最佳答案

看来您的方向是正确的。您将输入输入到 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 中的每个值,我会循环那么多次并插入那个索引的那么多值。我的解释可能听起来有点冗长,但看​​起来像:

int indx = 0;
for(int x = 0; x <= k; x++) {
    for(int y = 0; y < C[x]; y++) {
        B[indx++] = x;
    }
}

如果用这个循环替换上面的两个循环,那么一切都应该按预期工作。

请在此处查看实例:ideone

关于c++ - C++中的计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54351227/

相关文章:

c++ - std::variant 和 std::visit: 错误:没有名为 'valueless_by_exception' 的成员

c++ - 当特定条件为真时,如何在 Eclipse 中以编程方式设置 C++ 断点?

mongodb - Mongo聚合框架无法按两个字段排序?

c - 如何仅使用堆栈操作对堆栈进行排序?

c++ - 计数排序的修改

c++ - 尝试使用 Bonjour 运行演示应用程序,但无法发现在同一主机上运行的服务器

c++ - 多个运算符重载导致不明确的调用

Java nanoTime 没有抛出可靠的结果

计数排序 - C

javascript - 计数排序数组值没有改变