当我尝试运行此代码输出是“merge.exe已停止工作”?

时间:2017-01-01 17:47:26

标签: c++ arrays mergesort

#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++];
    }
}
}

1 个答案:

答案 0 :(得分:1)

您已尝试访问以下行中的越界索引(在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++) 

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