c++ 如何处理这种奇偶气泡排序错误?

ni65a41a  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(139)

我想问一下为什么在VScode中奇偶冒泡排序的偶数边会引发一个zsh:abort错误?是因为它超出了范围吗?如果是这样,是不是意味着我必须精确地修改范围?谢谢!

#include <iostream>
using namespace std;

int main()
{
    int a[10];
    for (int i=0;i<10;i++)
    {
        cin>>a[i];
    }
    //First, sort odd and even numbers
    int l=0,r=9;//point to the two ends of the array
    while (l<=r)
    {
        bool leftIsOdd=a[l]%2==1;
        bool rightIsEven=a[r]%2==0;
        //move the two pointers from ends to middle
        if (leftIsOdd)
        {
            l++;
        }
        else if (rightIsEven)
        {
            r--;
        }
        //since it's a symmetric array, with 5 odd and 5 even, we can swap when both sides get stuck
        //Q:If we have 4 odd numbers and 6 even numbers, is the approach OK?
        else if (!leftIsOdd && !rightIsEven)
        {
            int temp=a[l];
            a[l]=a[r];
            a[r]=temp;
        }
    }
    //perform bubble sort for left odd part
    int start=0,end=l;
    for (int i=start; i<end-1;i++)
    {
        for (int j=start+1;j<end-i;j++)
        {
            if (a[j-1]>a[j])
            {
                int temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }
    //now bubble the right even side
    start=l,end=10;
    for (int i=start; i<end-1;i++)
    {
        for (int j=start+1;j<start+end-i;j++)
# # #         //Why j<start+end-1 would produce error?
        {
            if (a[j-1]>a[j])
            {
                int temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }
    for (int i=0;i<10;i++)
    {
        cout<<a[i]<<' ';
    }
    return 0;
}

我尝试将索引j置于预期范围之外,但收到了zsh:abort错误。

ccrfmcuu

ccrfmcuu1#

如果你用前面提到的10,9,8,7,6,5,4,3,2,1初始化输入数组a,那么当你到达“// now bubble the right even side”循环时,你会把start初始化为5,把end初始化为10。如果你写j<start+end-1,那么j就可以大到13。(即j必须小于14)。然后您将尝试访问a[13],但a只有10个元素。因此,如果幸运的话,您将在运行程序时得到某种内存访问错误,并且它将崩溃。
我不知道为什么要用导致崩溃的表达式j<start+end-1替换表达式j<start+end-i(似乎可以工作)。
在声明和初始化a之后,只需包含a[13]=0;行,就可以使崩溃更容易发生。
当你使用数组时,你有责任确保所有数组访问都是有效的。当你问“这是否意味着我必须精确地修改范围”时,答案是“是的,绝对的!”

相关问题