这个合并排序错在哪??编译没问题,为什么运行不出结果???帮我找找问题!!!
#include<iostream.h>
#include<stdlib.h>
#include "time.h"
void merge(long l[],long left,long mid,long right)
{
long *a= new long [right-left+1];
mid=(right+left)/2;
long i,j,k;
while(i<=mid && j<=right)
{
if(l[i]<l[j])
a[k++]=l[i++];
else
a[k++]=l[j++];
}
while (i<=mid) a[k++]=l[i++];
while (j<=right) a[k++]=l[j++];
for(i=0,k=left;k<right;)
l[i]=a[k++];
}
void mergesort(long a[],long left,long right)
{
if(left<right)
{
long mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a,mid+1,right);
merge(a,left,mid,right);
}
}
void main()
{
const N=100000;
long a[N],i;
clock_t start, finish;
double duration;
for(i=0;i<N;i++)
a[i]=rand();
start=clock();
mergesort(a,0,N);
finish=clock();
for(i=0;i<N;i++)
cout<<a[i];
cout<<endl;
cout<<"使用的时间为:"<<duration<<"秒"<<endl;
}
[解决办法]
- C/C++ code
#include <iostream.h>#include <stdlib.h> #include "time.h" void merge(long l[],long left,long mid,long right) { long *a= new long [right-left+1]; //mid=(right+left)/2; //这句不要 long i=left,j=mid+1,k = 0; //没有初始化 while(i <=mid && j <=right) { if(l[i] <l[j]) a[k++]=l[i++]; else a[k++]=l[j++]; } while (i <=mid) a[k++]=l[i++]; while (j <=right) a[k++]=l[j++]; for(i=0,k=left;k <=right;) //错误,数组a是从0开始,l是从left开始 l[k++]=a[i++]; } void mergesort(long a[],long left,long right) { if(left <right) { long mid=(left+right)/2; mergesort(a,left,mid); mergesort(a,mid+1,right); merge(a,left,mid,right); } } void main() { const N=10000; long a[N],i; clock_t start, finish; double duration; for(i=0;i <N;i++) a[i]=rand(); start=clock(); mergesort(a,0,N); finish=clock(); for(i=0;i<N;i++) cout <<a[i]<<ends; cout <<endl; cout <<"使用的时间为:" <<duration <<"秒" <<endl; }