*#include <iostream>
#include <math.h>
using namespace std;
#define N 120
double arra[N]={0};
double arrb[N]={0};
void rand_data()
{
for(int i=0;i<N;i++)
arra[i]=rand()%1000;
}
void Merge(double *arra, double *arrb, int low, int mid, int high)
{
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high)
{
if(arra[i]<arra[j]) arrb[k++]=arra[i++];
else arrb[k++]=arra[j++];
}
while(i<=mid)
{
arrb[k++]=arra[i++];
}
while(j<=high)
{
arrb[k++]=arra[j++];
}
}
void MergeSort(double *arra, double *arrb, int n)
{
int step,i,j,k;
int flag=0;
for(step=1;step<=n;step*=2)
{
flag=log((double)step)/log((double)2);
//cout<<"flag is "<<flag<<endl;
if(flag%2==0)
{
for(i=0;i<n-2*step+1;i+=2*step)
Merge(arra,arrb,i,i+step-1,i+2*step-1);//require i+2*step-1 < n
if(i<n-step+1)
{
Merge(arra,arrb,i,i+step-1,n-1);//require i+step-1 < n
}
else
{
for(k=i;k<n;k++)
arrb[k]=arra[k];
}
}
else
{
for(i=0;i<n-2*step+1;i+=2*step)
Merge(arrb,arra,i,i+step-1,i+2*step-1);//require i+2*step-1 < n
if(i<n-step+1)
{
Merge(arrb,arra,i,i+step-1,n-1);//require i+step-1 < n
}
else
{
for(k=i;k<n;k++)
arra[k]=arrb[k];
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
rand_data();
for(int i=0;i<N;i++)
cout<<arra[i]<<" ";
cout<<endl;
MergeSort(arra,arrb,N);
for(int i=0;i<N;i++)
cout<<arra[i]<<" ";
cout<<endl;
for(int i=0;i<N;i++)
cout<<arrb[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
改进的归并排序算法
最新推荐文章于 2021-05-12 21:42:42 发布