我有新版本的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;
}
答案 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是相当冒昧的。这就像打电话给回旋镖而不是回旋镖实际上它只是一根棍子。