按升序排列数组

arranging array in ascending order

本文关键字:数组 排列 升序      更新时间:2023-10-16

我正在尝试安排一个随机数组。在代码中,这只是按大小交换位置的第一步。当运行代码时,得到Debug Error,交换后的输出显示数组中的第一个数字被删除,最后一个是内存中的一个长随机数。看起来它是从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

问题在这里: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) ...
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])

表示访问超出范围的数组。