//****************************************************************************//
// Compare QuickSort with MergeSort //
//****************************************************************************//
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <string.h>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//as following,you can change
#define Filein "numberin2.txt" //filenames
#define FileoutQS "numberoutQuickSort2.txt"
#define FileoutMS "numberoutMergeSort2.txt"
#define N 150000
//2^10=1024,2^12=4096,2^14=16384,2^16=65536 2^18=
//2--255555
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//******************Produce Numbers to the file Filein**************************
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void producenumber(long n) //n:how many numbers will be produced
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{FILE *fp;
srand((unsigned) time(NULL));
if((fp=fopen(Filein,"w"))==NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{printf("cannot open File.\n");
return;
}
long p;
int num;
for(p=0;p<n;p++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
num=rand();
fprintf(fp,"%d",num);
fseek(fp,sizeof(num),1);
}
fclose(fp);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//******************Read numbers from file Filein*******************************
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void readASCnum(int *a,long n) //a[]:numbers group;n:how many
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{FILE *fp;
if((fp=fopen(Filein,"r"))==NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{printf("cannot open File.\n");
return;
}
long p;
int num;
for(p=0;p<n;p++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
fscanf(fp,"%d",&num);
a[p]=num; //数组赋值
fseek(fp,sizeof(num),1);
}
fclose(fp);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//**************************write results to the file Fileout*******************
void writeASCnum(int a[],long n,char file[]) //write number a[];n:how many
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{FILE *fp;
if((fp=fopen(file,"w"))==NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{printf("cannot open File.\n");
return;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{for(long i=0;i<n;i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
fprintf(fp,"%d ",a[i]);
fseek(fp,sizeof(a[i]),1);
}
}
fclose(fp);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//******************************** QuickSort ********************************
template <class T>
void Swap(T &a,T &b)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
T temp=a;a=b;b=temp;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template <class T>
long Partition(T a[],long p,long r) //partion from a[p] to a[r]
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long i=p;
long j=r+1;
T x=a[p];
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while(1)
{
while(a[++i]<x);
while(a[--j]>x);
if(i>j)break;
Swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
return j;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<class T>
void QuickSort(T a[],long p,long r) //a[]:numbers;p,r:from a[p] to [r] sort
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(p<r)
{
long q=Partition(a,p,r);
QuickSort(a,p,q-1);//对左半段排序
QuickSort(a,q+1,r);//对右半段排序
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//******************************** MergeSort *********************************
template<class T>
void Merge(T c[],T d[],long l,long m,long r)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{//合并c[l:m]和c[m+l:r]到d[l:r]
long i=l,j=m+1,k=l;
while ((i<=m)&&(j<=r))
if(c[i]<=c[j])d[k++]=c[i++];
else d[k++]=c[j++];
if(i>m)for(long q=j;q<=r;q++)
d[k++]=c[q];
else for(long q=i;q<=m;q++)
d[k++]=c[q];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<class T>
void MergePass(T x[],T y[],long s,long n)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long i=0;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (i<=n-2*s)
{
//合并大小为s的相邻2邻段子数组
Merge(x,y,i,i+s-1,i+2*s-1);
i=i+2*s;
}
//剩下的元素个数少于2s
if(i+s<n)Merge(x,y,i,i+s-1,n-1);
else for (long j=i;j<=n-1;j++)
y[j]=x[j];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
template<class T>
void MergeSort(T a[],long n) //port:a[]:number;n:how many
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
T *b = new T [n];
long s = 1;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
while (s<n)
{
MergePass(a,b,s,n);
s+=s;
MergePass(b,a,s,n);
s+=s;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//********************************** smain ************************* ***********
void smain(long n)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{ int *s=new int[n];
int t1,t2,t;
producenumber(n);
cout<<"produce over"<<endl;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
readASCnum(s,n);
t1=GetTickCount();
QuickSort(s,0,n-1);
t2=GetTickCount();
t=t2-t1;
cout<<"the time QuickSort costed is :"<< t <<endl;
writeASCnum(s,n,FileoutQS);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
readASCnum(s,n);
t1=GetTickCount();
MergeSort(s,n);
t2=GetTickCount();
t=t2-t1;
cout<<"the time MergeSort costed is :"<< t <<endl;
writeASCnum(s,n,FileoutMS);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void main()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
smain(N);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//*********************************** main end *********************************