当我尝试运行此代码输出时"merge.exe has stopped working"?


#include<iostream>
#define INF 10000
using namespace std;
void mergeSort(int *x,int y,int z);
void merge(int *a,int p,int q,int r);
void main()
{
int i,size;
cin>>size;
int arr[size];
for(i=0;i<size;i++)
{
    cin>>arr[i];
} 
mergeSort(arr,0,size-1);
for(i=0;i<size;i++)
{
    cout<<arr[i]<<endl;
}
}

此函数接收要排序的数组以及开始和结束索引的值,即 y,z。

void mergeSort(int *x,int y,int z)
{
int q;
if(y<z)
{
    q=(y+z)/2;
    mergeSort(x,y,q);
    mergeSort(x,q+1,z);
    merge(x,y,q,z);
}
}

此函数合并数组的两个排序部分,P,R 是开始和结束索引,而 q 是将数组分成两个排序部分的索引

void merge(int *a,int p,int q,int r)
{
int l1,l2,i,j;
l1=q-p+1;
l2=r-q;
int left[l1+1],right[l2+1];
for(int i=0;i<l1;i++)
{
    left[i]=a[p+i];
}
for(int j=0;j<l2;j++)
{
    right[i]=a[q+j];
}
left[l1+1]=INF;
right[l2+1]=INF;
i=0;
j=0;
for(int k=0;k<=r-p;k++)
{
    if(left[i]<right[j])
    {
        a[k]=left[i++];
    }
    else
    {
        a[k]=right[j++];
    }
}
}

您尝试访问以下行中的越界索引(在merge()子例程中):

left[l1 + 1] = INF;
right[l2 + 1] = INF;

大小分别为l1+1l2+1。因此,有效索引的范围将是[0, l1][0, l2]。因此,这些行应为:

left[l1] = INF;
right[l2] = INF;

最后一个问题在行中:

for(int k = 0; k <= r-p; k++)

应该是

for(int k = p; k <= r; k++) 

否则,您将覆盖其他值。您必须将合并的零件插入正确的位置。

最新更新