#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++];
}
}
}
答案 0 :(得分:1)
您已尝试访问以下行中的越界索引(在merge()
子例程中):
left[l1 + 1] = INF;
right[l2 + 1] = INF;
尺寸分别为l1+1
和l2+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++)
否则,您将只覆盖其他值。您必须将合并的部分插入正确的位置。