按升序排列数组

时间:2014-03-13 00:58:05

标签: c++ arrays

我试图安排随机数组。在代码中,它只是按大小交换位置的第一步。 运行代码时,获取调试错误和交换后的输出显示数组中的第一个数字已删除,而最后一个数字是内存中的长随机数。 看起来它从i = 1开始交换,为什么?

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void buildArray(int arr[], int size) {
    srand ( (unsigned int)time(NULL) );
    for(int i = 0; i < size; ++i)
        arr[i] = rand() % 50 + 0;
}


void dispArray(int arr[], int size) {
     for(int i = 0; i < size; ++i)
        cout << i << ": " << arr[i] << endl;
}


int main()
{
        const int size = 5;
    int     arr[size];
    buildArray(arr, size);
    dispArray(arr, size);

    int swapHolder = -1;
    for(int i = 0; i < size; ++i) {
    if(arr[i] > arr[i+1]) {
            swapHolder = arr[i+1];
            arr[i+1] = arr[i];
            arr[i] = swapHolder;
            cout << endl;
        }
    }
    dispArray(arr, size);

    return 0;
}  


Output example:
0: 46
1: 15
2: 47
3: 5
4: 19


0: 15
1: 46
2: 5
3: 19
4: -858993460

2 个答案:

答案 0 :(得分:2)

以下是问题:if(arr[i] > arr[i+1]),您的for循环来自[0, size - 1],所以在最后一次迭代中,我们说size = 5,您将测试if(arr[5] > arr[6]),访问未初始化的arr[6],正确的方法是让你的for循环从[0, size - 2]开始:

for(int i = 0; i < size - 1; ++i) ...

答案 1 :(得分:1)

for(int i = 0; i < size; ++i) {
    if(arr[i] > arr[i+1]) {
            swapHolder = arr[i+1];
            arr[i+1] = arr[i];

最后一次迭代是针对 i = size -1 。然后

 if(arr[i] > arr[i+1])

表示访问数组超出范围。这是未定义的行为。