为什么以下合并排序代码不起作用?

时间:2015-11-05 17:46:30

标签: c++ sorting data-structures merge

以下代码应该更改什么?它显示以下错误

  

错误:ld.so:来自LD_PRELOAD的对象'/home/bot/funcs.so'无法预加载(无法打开共享对象文件):忽略。

     

`/ home / bot / dcb7b4b8f54571a4467c2113b7856878'出错:free():下一个大小无效(快):0x0000000000c350b0

DateTime.parse(strDate, DateTimeFormat.forPattern(format).withLocale(Locale.US)).toDate();

2 个答案:

答案 0 :(得分:0)

您应该使用std::vector而不是原始指针:

typedef std::vector<int> ivector;

void merge( const ivector &l, const ivector &r, ivector &to )
{
     ivector_const::iterator il = l.begin();
     ivector_const::iterator ir = r.begin();
     ivector::iterator ito = to.begin();

     while( true ) {
         if( il == l.end() ) {
              if( ir == r.end() ) 
                  return;
              *ito++ = *ir++;
         } else {
              if( ir == r.end() || *il < *ir )
                  *ito++ = *il++;
              else
                  *ito++ = *ir++;
         }
    }
}

void mergesort( ivector &v )
{
      if(v.size()<2) return;
      ivector::iterator imid = v.begin() + v.size() / 2;
      ivector left( v.begin(), imid );
      ivector right( imid, v.end() );

      mergesort(left);
      mergesort(right);
      merge( left, right, v );
}

int main() {
    //code
    ivector a ={10,7,8,9,4,2,3,6,5,1};
    mergesort(a);
    for(size_t i=0;i<a.size();i++)
    {
       cout<<a[i]<<"\t";
    }
    return 0;
} 

注意:我没有验证你的算法只是用std::vector而不是原始指针重写它。您可以注意到使用正确的数据类型时函数变得多么简单。

答案 1 :(得分:0)

评论中提到的修复,似乎现在正在运作。在main或helper函数中一次性分配临时数组会更快。使用相互递归的函数(一个合并AtoA,另一个合并AtoTemp,它们相互调用),消除了必须复制数据。如果需要,我可以稍后发布一个例子。自下而上的合并排序会稍快一些。

#include <iostream>

using namespace std;

// fix return type to void
void merge(int *left,int nl,int *right,int nr,int *a)
{
    int i=0,j=0,k=0;
    while(i<nl && j<nr)
    {
        if(left[i]<right[j])
        {
            a[k]=left[i];
            i++;
        }
        else
        {
            a[k]=right[j];
            j++;
        }
        k++;
    }
    while(i<nl)
    {
        a[k]=left[i];
        i++;
        k++;                    // fix
    }
    while(j<nr)
    {
        a[k]=right[j];
        j++;
        k++;                    // fix
    }
}

// fix return type to void
void mergesort(int *a,int n)
{
    if(n<2) return;             // fix: change return type to void
    int mid=n/2;
    int *left=new int[mid];
    int *right=new int[n-mid];

    for(int i=0;i<=mid-1;i++)
    {
        left[i]=a[i];
    }
    for(int i=mid;i<=n-1;i++)
    {
        right[i-mid]=a[i];      // fix
    }
    mergesort(left,mid);
    mergesort(right,n-mid);
    merge(left,mid,right,n-mid,a);
    delete[]left;
    delete[]right;
}

int main() {
    //code
    int a[]={10,7,8,9,4,2,3,6,5,1};
    int n=sizeof(a)/sizeof(a[0]);
    mergesort(a,n);
    for(int i=0;i<10;i++)
    {
        cout<<a[i]<<"\t";
    }
    cout << endl;               // added this not needed
    return 0;
}

清理,将输出更改为不使用标签:

#include <iostream>
#include <iomanip>              // for std::setw()

using namespace std;

void merge(int *left,int nl,int *right,int nr,int *a)
{
    int i=0,j=0,k=0;
    while(i<nl && j<nr)
    {
        if(left[i]<right[j])
            a[k++]=left[i++];
        else
            a[k++]=right[j++];
    }
    while(i<nl)
        a[k++]=left[i++];
    while(j<nr)
        a[k++]=right[j++];
}

void mergesort(int *a,int n)
{
    if(n<2)
        return;
    int mid=n/2;
    int *left=new int[mid];
    int *right=new int[n-mid];

    for(int i=0;i<=mid-1;i++)
        left[i]=a[i];
    for(int i=mid;i<=n-1;i++)
        right[i-mid]=a[i];
    mergesort(left,mid);
    mergesort(right,n-mid);
    merge(left,mid,right,n-mid,a);
    delete[]left;
    delete[]right;
}

int main() {
    int a[]={10,7,8,9,4,2,3,6,5,1};
    int n=sizeof(a)/sizeof(a[0]);
    mergesort(a,n);
    for(int i=0;i<10;i++)
        cout<<setw(2)<<a[i]<<" ";  // 2 digit field output
    cout << endl;
    return 0;
}