从这篇文章开始,我将陆续介绍几种排序算法,内容包括算法描述,源代码,性能测试报告等。要介绍的排序算法有冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序。
所有的代码可包括在一个VC工程文件之中。这里写给出这些排序子程序使用的公共头文件和时间测试函数。所有代码为标准的C语言代码。我这里没有使用C++的特性。先给出公共头文件sorts.h
#ifndef BUBBLE_SORT_DEF_2018_02_21
#define BUBBLE_SORT_DEF_2018_02_21
#include <stdint.h>
typedef int ELE_TYPE;
typedef int* ELE_PTR;
#define BOOL int
#define FALSE 0
#define TRUE 1
#define MAX_LEN 2000000
#define INSERT_SORT_THRESHOLD 16
extern uint64_t getCurrentTimeMsec();
extern void print_array(ELE_TYPE arr[], int len);
extern void insert_sort(ELE_TYPE arr[], int len);
extern void shell_sort(ELE_TYPE arr[], int len);
extern void merge_sort(ELE_TYPE arr[], int len);
extern void quick_sort(ELE_TYPE arr[], int len);
extern void heap_sort(ELE_TYPE arr[], int len);
#endif
再给出一个c文件common.c, 这个文件包含2个函数,用于测量时间和打印数组,以验证排序后的内容是否正确。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <winsock2.h>
#include <time.h>
#else
#include <sys/time.h>
#endif
#include "sorts.h"
uint64_t getCurrentTimeMsec()
{
#ifdef _WIN32
struct timeval tv;
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tv.tv_sec = clock;
return ((uint64_t)tv.tv_sec * 1000 + (uint64_t)wtm.wMilliseconds);
#else
struct timeval tv;
gettimeofday(&tv,NULL);
return ((uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000);
#endif
}
void print_array(ELE_TYPE arr[], int len)
{
int i;
for (i = 0; i < len; i++)
printf("%d ",arr[i]);
printf("\n");
}