2010-11-24 65 views
-1

我有以下为自下而上代码归并它确实是对文件的操作间通过-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

异常来自哪条线?你试图访问什么元素,你相信这个媒介有多大?你那个时候的调用堆栈有多深?索引是否超出范围,i,j或k? 老实说,@ user466441,你的大部分问题都是“这是一堆代码,请帮助”,没有任何信息或你的努力。 – abelenky 2010-11-24 17:23:22

+0

我重新格式化了你的代码。但是,更一致的格式仍然不能解决您的不良变量名称,括号和单行语句的不一致使用。 – abelenky 2010-11-24 17:27:30

回答

1

您创建b作为一个空向量,然后开始寻址其元素。它的大小为0,所以这是无效的。你应该给它更大的尺寸。

2

您尚未初始化您的矢量以获取其中的任何数据。

我想这是一个练习,这就是为什么你重新发明轮子。我不确定这是否是使用单字符标识符的理由,这会使您的代码难以理解。

如果是一个数组,l是其长度,你可以初始化b相

vector<int> b(a, a+l); 

想必你创建你的数组排序的目的的临时副本。

是不是合并递归,顺便说一下?我没有看到你的存在。

我的代码也存在其他问题,例如缩进表明for循环是嵌套的,但与for语句位于同一行的语句后面的分号表示否则会提示。我建议你总是在循环中使用大括号。

2

功能merge您有vector<int>b; b在这里的大小为0。你应该rezise()您的载体,或用数组初始化:

vector<int> v(arr, arr+size); 
1

其他人,试图索引元素的空载体解决您的问题。此外,下面的循环中存在一个问题:

for (i=m+1;i>=l;i--) b[i-1]=a[i-1]; 

通过循环的最后迭代有i=l和你解决矢量/阵列的[i-1]元件。当l=0这是索引-1,并将向量和阵列超出范围。