2016-04-23 50 views
3

我需要一个程序来排序整数数组而不使用条件语句。数字在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 - 围绕堆栈变量“改编”已损坏。

有没有办法解决它?

+0

你正在使用哪种编译器? “作品” – Tejendra

+1

可能有点强大。 –

+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)。

2

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

这意味着,经过一段时间,的i值将是6,通过它来作为索引使用成arr,但索引6第七数组中的元素,从而导致你写出界。