mergesort的新版本

时间:2010-11-16 22:17:52

标签: c++ algorithm

  

可能重复:
  mergesort algorithm in c++

我有新版本的mergesort,但它也没有用,它给了我 5 5 5 5 6 5 10 5这里的代码是代码

#include <iostream>
using namespace std;
const int n=9;
void   merge(int a[],int l,int m,int r){
    int i, j;

    static int aux[n];
      for (i=m+1;i>l;i--) aux[i-1]=a[i-1];
       for (j=m;j<r;j++)  aux[r+m-j]=a[j+1];
          for (int k=l;k<r;k++)
              if (  aux[j]<aux[i])
                  a[k]=aux[j--];   else a[k]=aux[i++];


}
void mergesort(int a[],int l,int r){

     if (r<=l)  return ;
     int m=(r+l)/2;
     mergesort(a,l,m);
     mergesort(a,m+1,r);
     merge(a,l,m,r);

}
int main(){


    int a[]={12,13,10,7,6,5,8,9,5};
    int n=sizeof(a)/sizeof(int);
      mergesort(a,0,n);
       for (int i=0;i<n;i++){
           cout<<a[i]<<"  ";
       }




     return 0;
}

2 个答案:

答案 0 :(得分:0)

如果r在这里

void mergesort(int a[],int l,int r)

是包含上限,然后是

int n=sizeof(a)/sizeof(int);
  mergesort(a,0,n);

n的值应小于1,因为数组a [9]的索引为0..8,而不是0..9。

  mergesort(a,0,n-1);

# 在这里:

      for (int k=l;k<r;k++)
          if (  aux[j]<aux[i])
              a[k]=aux[j--];   else a[k]=aux[i++];

真的很有意思!这就是我开始调试这个程序的原因。但是在for()运算符中出错:它不处理最后一个元素,因为如果使用包含边界,则应该测试k<=r,而不是k<r

      for (int k=l;k<=r;k++)

答案 1 :(得分:-1)

如果你的算法不起作用,告诉大家你有一个新版本的mergesort是相当冒昧的。这就像打电话给回旋镖而不是回旋镖实际上它只是一根棍子。