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);
}