该文对几种较快的排序算法做了性能测试。测试的算法包括希尔排序,归并排序和快速排序。由于冒泡排序,插入排序,选择排序速度较慢,我们这里没有给出数据。
所有几种算法在同一个程序中运行,使用同样的数据。通过修改宏MAX_LEN的值,我们对数据规模为1百万,2百万和4百万分别做的测试。 我们做了2轮测试,第一轮测试中,归并排序中调用merge_v1, 第二轮测试中归并排序调用merge_v2_asm. 下面是测试结果。
第一轮测试结果,运行在Linux 环境,CPU为E5-2670。对于每种规模的数据测试4次,取后3次的平均值,时间单位为毫秒
数据个数 | 1百万 | 2百万 | 4百万 |
希尔排序 | 330 | 749 | 1660 |
归并排序 | 133 | 278 | 581 |
快速排序 | 143 | 294 | 616 |
堆排序 | 371 | 796 | 1713 |
第二轮测试结果,运行在windows. 硬件环境与第一轮不同。对于每种规模的数据测试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 )
{
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 得到全部代码