【问题标题】:bottom up mergesort自下而上的归并排序
【发布时间】:2010-11-24 11:47:18
【问题描述】:

我有以下代码用于自下而上的归并排序,它对文件进行操作 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;
}

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

【问题讨论】:

  • 异常来自哪一行?你试图访问什么元素,你认为向量有多大?那时你的调用堆栈有多深?索引是否超出范围 i、j 或 k?老实说,@user466441,你的大部分问题都是“这里有一堆代码,请帮忙”,没有你提供任何信息或努力。
  • 我为您重新格式化了您的代码。然而,更一致的格式仍然不能解决你糟糕的变量名、括号的不一致使用和单行 for 语句。

标签: c++ mergesort


【解决方案1】:

你还没有初始化你的向量来包含任何数据。

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

如果 a 是一个数组并且 l 是它的长度,你可以用它来初始化 b

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

大概您正在为排序目的创建数组的临时克隆。

顺便说一句,归并排序不是递归的吗?我看不到你的存在。

您的代码也有其他问题,例如,您的缩进表明 for 循环是嵌套的,但与 for 语句位于同一行的语句后面的分号则暗示其他情况。我建议您始终在循环中使用大括号。

【讨论】:

  • 这就是“自下而上”的含义:它是循环递归而不是调用递归。
【解决方案2】:

merge 函数中,vector&lt;int&gt;b; b 在这里的大小为 0。你应该rezise()你的向量,或者用数组初始化它:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      其他人已经解决了您尝试在空向量中索引元素的问题。另外,下面的循环有问题:

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

      循环的最后一次迭代具有i=l 并且您寻址向量/数组的[i-1] 元素。当l=0 是索引-1 时,将超出向量和数组的范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 2017-07-09
        • 2016-09-19
        • 2018-11-06
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多