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

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

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

第一轮测试结果,运行在Linux 环境,CPU为E5-2670。对于每种规模的数据测试4次,取后3次的平均值,时间单位为毫秒

数据个数1百万2百万4百万
希尔排序3307491660
归并排序133278581
快速排序143294616
堆排序3717961713
第二轮测试结果,运行在windows. 硬件环境与第一轮不同。对于每种规模的数据测试4次,取后3次的平均值,时间单位为毫秒
数据个数1百万2百万4百万
希尔排序165410939
归并排序71145309
快速排序72172436
下面是测试程序的源代码
#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 )
{
	uint64_t start,end;
 
	start=getCurrentTimeMsec();
	fun(arr,len);
	end=getCurrentTimeMsec();
	printf("Did %s on %d elements spend %d ms\n", fun_name,len, (unsigned)(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[])
{
	printf("------------------------\n");
	all_sort_fun_perf_test();
	return 0;
}
 

本系列的全部文章已经托管到gitee. 可从 https://gitee.com/liangbch/sorts 得到全部代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值