赞
踩
直接贴代码:
//g++ -o mp mp.cpp
#include <stdio.h>
#include <cstring>
#include <sys/time.h>
#include <stdlib.h>
#include <ctime>
#define ML 1000000
void merge(int *pDst, int *pSrc, int nS, int nBaseLen )
{
int i,nCnt,ls,le,rs,re,k1,k2,m,iLoopN;
int *p=pDst;
int *p1,*p2,*pS;
nCnt = nS;
for(i=0;i<nS;i=i+2*nBaseLen)
{
le = (i+nBaseLen)>=nCnt?nCnt:(i+nBaseLen);
re = (le +nBaseLen)>=nCnt?nCnt:(le+nBaseLen);
m = ls;
p1=pSrc+i;
pS =pSrc;
p2=pSrc+i+nBaseLen;
while( p1<pS+le && p2<pS+re )
*(p++) = *(p1)<*(p2)?*(p1++):*(p2++);
while( p1<pS+le )
*(p++) = *(p1++);
while( p2<pS+re )
{
*(p++) = *(p2++);
}
}
// for(int i1=0;i1<nS;i1++)
// printf("%d, ", pDst[i1]);
printf("\n");
}
int main()
{
int nData[ML]={3,5,99,0,456,789,543};
int i,j,k;
int nSize=sizeof(nData)/sizeof(int);
srand(time(NULL));
for(i=0;i<nSize;i++)
nData[i]=rand()%ML+1;
printf("size: %d\n", nSize);
// for(i=0;i<nSize;i++)
// printf("%d, ", nData[i]);
printf("\n");
struct timeval tv;
gettimeofday(&tv,NULL);
printf("second:%ld\n",tv.tv_sec); //秒
printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000); //毫秒
printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒
for(i=0;i<nSize;i++)
for(j=0;j<nSize-i-1;j++)
{
if(nData[j]>nData[j+1])
{
k= nData[j];
nData[j]=nData[j+1];
nData[j+1]=k;
}
}
gettimeofday(&tv,NULL);
printf("second:%ld\n",tv.tv_sec); //秒
printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000); //毫秒
printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒
// for(i=0;i<nSize;i++)
// printf("%d, ", nData[i]);
printf("\n");
int nData1[ML]={6,3,5,99,0,456,789,543};
int pDst[ML];
nSize=sizeof(nData1)/sizeof(int);
for(i=0;i<nSize;i++)
nData1[i]=rand()%ML+1;
// for(i=0;i<nSize;i++)
// printf("%d, ", nData1[i]);
gettimeofday(&tv,NULL);
printf("second:%ld\n",tv.tv_sec); //秒
printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000); //毫秒
printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒
printf("\n");
bool flag=true;
for(i=1;i<nSize;i=i*2)
{
if(flag )
merge( pDst, nData1, nSize,i);
else
merge( nData1, pDst,nSize,i);
flag = !flag;
}
gettimeofday(&tv,NULL);
printf("second:%ld\n",tv.tv_sec); //秒
printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000); //毫秒
printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒
}
时间比较:
数字个数 | 冒泡耗时 | 归并耗时 | 相差倍数 |
1万 | 300ms | 1ms | 300倍 |
10万 | 34.4s | 15ms | 2295倍 |
100万 | 57.6min | 182ms | 19013倍 |
附注:
#include<>直接从编译器自带的函数库中寻找文件。(预定义的缺省路径通常是在INCLUDE环境变量中指定的,请看下例:
INCLUDE=C:\COMPILER\INCLUDE;S:\SOURCE\HEADERS; )
#include""是先从自定义的文件中找 ,如果找不到在从函数库中寻找文件
如果是自己写的头文件 建议使用#include“”
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。