为什么这个合并排序代码总是给我这个奇怪的输出?

Why does this merge sort code keeps giving me this weird output?

我写了计数排序代码,但它显示奇怪的输出,你能告诉我哪里错了吗??

#include <bits/stdc++.h>
using namespace std;

void CountSort(int a[], int n, int k)
{
    int count[k + 1]={0};
    int b[n];

    for (int i = 0; i < n; i++)
    {
        ++count[a[i]];
    }
    for (int i = 1; i <= k; i++)
    {
        count[i] += count[i - 1];
    }
    for (int i = 0; i >= 0; i--)
    {
        b[count[a[i]]-1] = a[i];
        --count[a[i]];
    }
    for (int i = 0; i < n; i++)
    {
        a[i] = b[i];
    }
}

int main()
{
    int a[] = {2, 1, 1, 0, 2, 5, 4, 0, 2, 8, 7, 7, 9, 2, 0, 1, 9};
    CountSort(a, 17, 9);
    cout<<"The sorted array is  ->  "<<a;
    return 0;
}

它给出这样的输出 -

The sorted array is  ->  0x7bfdd0

ScreenShot of the code and the output

尝试打印数组时,不能只使用 std::cout << a。目前您的代码正在打印数组 a 的内存地址,这不是您想要的。

要解决此问题,请一一打印数组的所有元素。这些循环可能会有帮助:

for (const auto& elem : a)
    std::cout << elem << " ";

或者

for (int i = 0; i < sizeof(a) / sizeof(int); i++)
    std::cout << a[i] << " ";

你的代码有两个错误。

  1. 打印数组的方法错误
  2. 第三个循环在 CountSort 中是错误的。这个循环只工作一次。

有修复结果

void CountSort(int a[], int n, int k)
{
    int count[k + 1]={0};
    int b[n];

    for (int i = 0; i < n; i++)
    {
        ++count[a[i]];
    }
    for (int i = 1; i <= k; i++)
    {
        count[i] += count[i - 1];
    }
    for (int i = 0; i < n; i++)
    {
        b[count[a[i]]-1] = a[i];
        --count[a[i]];
    }
    for (int i = 0; i < n; i++)
    {
        a[i] = b[i];
    }
}

int main()
{
    int a[] = {2, 1, 1, 0, 2, 5, 4, 0, 2, 8, 7, 7, 9, 2, 0, 1, 9};
    CountSort(a, 17, 9);
    cout<<"The sorted array is  ->  ";
    for (int i = 0; i < 17; ++i) {
        cout << a[i] << ' ';
    }
    cout << endl;
   
    return 0;
}

结果:

The sorted array is  ->  0 0 0 1 1 1 2 2 2 2 4 5 7 7 8 9 9