自下而上合并

时间:2010-11-24 11:47:19

标签: c++ mergesort

我有以下代码用于自下而上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;
}

但是当我运行此代码时,会出现异常,表示发生了矢量超出范围错误请帮助

4 个答案:

答案 0 :(得分:2)

您尚未初始化矢量以包含任何数据。

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

如果a是数组且l是其长度,则可以使用

初始化b
vector<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时,向量和数组都将超出范围。