排序数组没有条件

时间:2016-04-23 11:31:23

标签: c++ arrays sorting counting-sort

我需要一个程序来排序整数数组而不使用条件语句。数字的范围是0到100,不重复。

#include <iostream>
using namespace std;

int main() {
    int arr[] = { 34, 12, 24, 65, 63, 22 };
    int arraySize = (sizeof(arr) / sizeof(*arr));
    unsigned char buf[101] = { 0 };

    for (int k = 0; k < arraySize; k++) {
        buf[arr[k]]++;
    }

    unsigned char i = 0;
    for (int k = 0; k <= 100; k++) {
        arr[i] = k;
        i += buf[k];
    }

    for (int a : arr) {
        cout << a << endl;
    }
    system("pause");
    return 0;
}

此程序有效,但在关闭命令提示符后出现错误:

  

运行时检查失败#2 - 变量'arr'周围的堆栈已损坏。

有没有办法解决它?

2 个答案:

答案 0 :(得分:3)

问题是你的代码写过数组的末尾。它发生在您遇到计数序列中的最后一个元素之后,但在数组buf用完之前,即

for (int k = 0; k <= 100; k++) {
    arr[i] = k;
    i += buf[k];
}

当您将最高元素(65)添加到结果时,i达到6,因此分配a[i]将变为非法。通过向数组添加一个额外的元素,将其设置为-1,并观察它发生了什么(它被设置为100; demo 1)来查看正在发生的事情。

你可以通过添加一个早期退出条件来修复它,一旦你填满阵列就停止,即

for (int k = 0; i < arraySize && k <= 100; k++) {
    arr[i] = k;
    i += buf[k];
}

现在,我们数组的“活动”部分结束后的-1仍为-1(demo)。

答案 1 :(得分:2)

第二个循环的逻辑是错误的。 arr中有六个数字,没有双打,这意味着buf中的总共六个元素将设置为1

这意味着一段时间后,i的值将为6,然后您将其用作arr的索引,但索引6是<数组中的em>第七个元素,导致你写出界限。