//两种方式改进归并,一是不递归;二是用两个数组,减少了重复赋值
#include <windows.h>
#include <iostream>
#include <math.h>
#include <ctime>
#include <cstring>
using namespace std;
LARGE_INTEGER BegainTime ;
LARGE_INTEGER EndTime ;
LARGE_INTEGER Frequency ;
#define n 5000
int arra[n]={0};
int arrb[n]={0};
int flag=0;
void rand_data()
{
for(int i=0;i<n;i++)
arra[i]=rand()%100000;
}
void merge_arra_arrb(int j,int k,int part1,int part2)//arra to arrb
//将arra中第j位置起的part1个元素和第k位置起的part2个元素经归并后移到arrb中第j个位置起part1+part2
{
for(int ij=j,ik=k,it=j;ij<j+part1&&ik<k+part2;it++)
{
if(arra[ij]<arra[ik]){arrb[it]=arra[ij];ij++;}
else {arrb[it]=arra[ik];ik++;}
}
while(ij!=j+part1)arrb[it++]=arra[ij++];
while(ik!=k+part2)arrb[it++]=arra[ik++];
}
void merge_arrb_arra(int j,int k,int part1,int part2)//arrb to arra
{
for(int ij=j,ik=k,it=j;ij<j+part1&&ik<k+part2;it++)
{
if(arrb[ij]<arrb[ik]){arra[it]=arrb[ij];ij++;}
else {arra[it]=arrb[ik];ik++;}
}
while(ij!=j+part1){arra[it++]=arrb[ij++];}
while(ik!=k+part2){arra[it++]=arrb[ik++];}
}
void merge_improve()
{
//int *arrb= new int [n];
int m=log(n)/log(2);
m++;//m表示最外层循环次数
//cout<<" "<<m<<endl;
int k,part1,part2,part=1;//数据段长1,2,4,8,16...
for(int i=0;i<m;i++)
{
//cout<<"in for widest "<<endl;
for(int j=0;j<n;j+=2*part)
{
//cout<<"in part circular "<<endl;
if(j+part<n){
//cout<<"in if (j+part<n) "<<endl;
k=j+part;//分别从j,k处开始
part1=part;
if(k+part<n)part2=part;
else part2=n-k;
}
else {
//cout<<"in else (j+part<n) "<<endl;
part1=n-j;
k=j;part2=0;
}
if(i%2==0)
{merge_arra_arrb(j,k,part1,part2);flag=1;}
//将arra中第j位置起的part1个元素和第k位置起的part2个元素经归并后移到arrb中第j个位置起part1+part2
else {merge_arrb_arra(j,k,part1,part2);flag=0;}
}
part=part*2;
}
}
int main()
{
cout<<"oupin "<<n<<"number"<<endl;
//int *data = new int[n];
//if(!data) exit(1);
/*int k = n;
while(k --){
cin >> arra[n-k-1];
}*/
double time[100];
double sum_s=0;
double average;
rand_data();
/*if(flag==0)
for(int i=0;i<n;i++)
cout<<arra[i]<<" ";
else
for(int i=0;i<n;i++)
cout<<arrb[i]<<" ";
cout<<endl;*/
/*clock_t e,s,average,total=0.0;
for(int j=0;j<100;j++)
{ s = clock();//clock_t
cout<<" time s "<<s<<endl;
merge_improve();
e = clock();//clock_t
cout<<" time e "<<e<<endl;
total+=e-s;
}
average=total/100;*/
for(int j=0;j<100;j++)
{
//CreateEulerGraph(&G);
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&BegainTime) ;
merge_improve();//FindEulerCircuit(G);
QueryPerformanceCounter(&EndTime);
cout<<"程序运行时间(单位:s): "<<(double)( EndTime.QuadPart-BegainTime.QuadPart )/ Frequency.QuadPart <<endl;
time[j]=(double)( EndTime.QuadPart-BegainTime.QuadPart )/ Frequency.QuadPart;
sum_s=sum_s+time[j];
}
average=sum_s/100;
cout<<"程序运行100次平均时间为:"<<average<<endl;
/* 显示部分
if(flag==0)
for(int i=0;i<n;i++)
cout<<arra[i]<<" ";
else
for(int i=0;i<n;i++)
cout<<arrb[i]<<" ";
cout << endl;*/
cout << "the algrothem used average time is " << average << " miliseconds."
<< endl;
return 0;
}