我需要一个程序来排序整数数组而不使用条件语句。数字的范围是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'周围的堆栈已损坏。
有没有办法解决它?
答案 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>第七个元素,导致你写出界限。