排序算法从入门到精通之九--性能测试

该文对几种较快的排序算法做了性能测试。测试的算法包括希尔排序,归并排序和快速排序。由于冒泡排序,插入排序,选择排序速度较慢,我们这里没有给出数据。

所有几种算法在同一个程序中运行,使用同样的数据。通过修改宏MAX_LEN的值,我们对数据规模为1百万,2百万和4百万分别做的测试。 我们做了2轮测试,第一轮测试中,归并排序中调用merge_v1, 第二轮测试中归并排序调用merge_v2_asm. 下面是测试结果。

第一轮测试结果。对于每种规模的数据测试4次,取后3次的平均值,时间单位为毫秒

数据个数 1百万 2百万 4百万
希尔排序 164 413 920
归并排序 79 160 329
快速排序 73 176 435
第二轮测试结果。对于每种规模的数据测试4次,取后3次的平均值,时间单位为毫秒
数据个数 1百万 2百万 4百万
希尔排序 165 410 939
归并排序 71 145 309
快速排序 72 172 436
下面是测试程序的源代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "sorts.h"

typedef void (*lpfn_sort_t)(ELE_TYPE arr[], int len);

extern void test_bubble_sort();
extern void test_select_sort();
extern void test_insert_sort();
extern void test_shell_sort();
extern void test_quick_sort();
extern void test_merge_sort();
extern void test_heap_sort();

void perf_test(ELE_TYPE *arr, int len, lpfn_sort_t fun, const char *fun_name )
{
	long start,end;

	start=get_millisecond();
	fun(arr,len);
	end=get_millisecond();
	printf("Did %s on %d element spend %d ms\n", fun_name,len, end-start);
}

void all_sort_fun_perf_test()
{
	ELE_TYPE *src=NULL;
	ELE_TYPE *arr=NULL;
	int i;

	src=(ELE_TYPE*)malloc(MAX_LEN*sizeof(ELE_TYPE));
	arr=(ELE_TYPE*)malloc(MAX_LEN*sizeof(ELE_TYPE));

	srand(time(NULL));
	for (i=0;i<MAX_LEN;i++)
		src[i]=rand() % MAX_LEN;

	memcpy(arr,src,sizeof(ELE_TYPE)*MAX_LEN);
	perf_test(arr, MAX_LEN, shell_sort, "shell sort" );

	memcpy(arr,src,sizeof(ELE_TYPE)*MAX_LEN);
	perf_test(arr, MAX_LEN, merge_sort, "merge sort" );

	memcpy(arr,src,sizeof(ELE_TYPE)*MAX_LEN);
	perf_test(arr, MAX_LEN, quick_sort, "quick sort" );

	memcpy(arr, src, sizeof(ELE_TYPE)*MAX_LEN);
	//perf_test(arr, MAX_LEN, heap_sort, "heap sort");

	free(src); src=NULL;
	free(arr); arr=NULL;
}


int main(int argc, char* argv[])
{
	//test_bubble_sort();
	//test_select_sort();
	//test_insert_sort();
	//test_merge_sort();

	printf("------------------------\n");
	all_sort_fun_perf_test();
	return 0;
}




阅读更多

没有更多推荐了,返回首页