您的位置:首页 > 编程语言

6种排序的时间测试代码

2013-08-20 22:32 218 查看
double* CreatArray(int len) //创建长度为len的随机数组
{
int i;
double* p=(double*)malloc(sizeof(double)*len);

srand(time(0));
for (i=0;i<len;i++)
{
p[i]=1000.0*rand()/(RAND_MAX+1.0);
}
return p;
}

void PrintArray(double* a,int len)
{
for (int i=0;i<len;i++)
{
printf("%7.3f ",a[i]);
}
printf("\n");
}

void CheckArray(double* a,int len) //检查数组中的值,是否是升序排列
{
int i;
for (i=1;i<len;i++)
{
if (a[i-1]>a[i])
printf("error!\n");
}
}

int cmpDouble(const void *x, const void *y)  //库函数中的快速排序函数使用qsort
{
return (*(double*)x > *(double*)y ? 1 : -1);
}

int main(void)
{
struct timeval tBegin,tEnd;
double time=0;
double *a=NULL;
int len=50000*1000;

/*
a=CreatArray(len);
gettimeofday(&tBegin);
BubbleSort_1(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("冒泡 1 排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
BubbleSort_2(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("冒泡 2 排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
BubbleSort_3(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("冒泡 3 排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
SelectSort(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("选择排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
InsertSort(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("插入排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);
*/

a=CreatArray(len);
gettimeofday(&tBegin);
HeapSort(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("堆排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
MergeSort_xunhuan(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("归并排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
qsort(a, len, sizeof(a[0]), cmpDouble);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("库函数快速排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

a=CreatArray(len);
gettimeofday(&tBegin);
QuickSort_2(a,0,len-1);
gettimeofday(&tEnd);
time=tEnd.tv_sec-tBegin.tv_sec+(tEnd.tv_usec-tBegin.tv_usec)/1000000.0;
printf("快速排序耗时%5.3lfs\n",time);
CheckArray(a,len);
free(a);

return 0;
}


由于vs中没有gettimeofday函数,下面是该函数的实现。

#ifndef UTC_TIME_STAMP_H_
#define UTC_TIME_STAMP_H_
#endif

#include <windows.h>
#include <sys/timeb.h>
#include <time.h>

#if !defined(_WINSOCK2API_) && !defined(_WINSOCKAPI_)
struct timeval
{
long tv_sec;
long tv_usec;
};
#endif

static int gettimeofday(struct timeval* tv)
{
union {
long long ns100;
FILETIME ft;
} now;
GetSystemTimeAsFileTime (&now.ft);
tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);

return (0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: