我有以下代码用于自下而上mergesort它是否对文件进行操作m-by-m合并双遍m每次传递这里是代码
#include <iostream>
#include <vector>
using namespace std;
inline int Min(int a,int b)
{
return a<b?a:b;
}
void merge(int a[],int l,int m,int r)
{
vector<int>b;
int i, j;
for (i=m+1;i>=l;i--) b[i-1]=a[i-1];
for (j=m;j<r;j++) b[r+m-j]=a[j+1];
for (int k=l;k<=r;k++)
if ( b[j]<b[i])
a[k]=b[j--];
else
a[k]=b[i++];
}
void mergesort(int a[],int l,int r)
{
for (int m=1;m<=r-l;m=m+m)
for (int i=l;i<=r-m;i+=m+m)
merge(a,i,i+m-1,Min(i+m+m-1,r));
}
int main()
{
int a[]={12,4,7,3,9,8,10,11,6};
int n=sizeof(a)/sizeof(int);
mergesort(a,0,n-1);
for (int i=0;i<n;i++)
{
cout<<a[i]<< " ";
}
return 0;
}
但是当我运行此代码时,会出现异常,表示发生了矢量超出范围错误请帮助
答案 0 :(得分:2)
您尚未初始化矢量以包含任何数据。
我想这是一个练习,这就是你重新发明轮子的原因。我不确定这是否是使用单字符标识符的借口,这会使您的代码难以理解。
如果a是数组且l是其长度,则可以使用
初始化bvector<int> b( a, a+l );
大概是为了排序而创建数组的临时克隆。
顺便说一下,mergesort不是递归的吗?我不认为你的存在。
我的代码也有其他问题,例如你的缩进表明for循环是嵌套的,但是与for语句在同一行上的语句之后的分号表示不然。我建议你总是在你的循环上使用大括号。
答案 1 :(得分:2)
在函数merge
中,vector<int>b;
b的大小为0。你应该rezise()
你的向量,或者用数组初始化它:
vector<int> v(arr, arr+size);
答案 2 :(得分:1)
您将b
创建为空向量,然后开始寻址其元素。它的大小为0,因此无效。你应该给它一个更大的尺寸。
答案 3 :(得分:1)
其他人已经尝试在空向量中索引元素来解决您的问题。另外,以下循环有一个问题:
for (i=m+1;i>=l;i--) b[i-1]=a[i-1];
循环的最后一次迭代有i=l
,你可以解决向量/数组的[i-1]
元素。当l=0
这是索引-1
时,向量和数组都将超出范围。