冒泡和归并排序对比

直接贴代码:

//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“”


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值