这篇博文是对前面集中排序算法的具体测试,采用所有算法排序同一样本随机数组来测试算法具体的效率。MAX_LEN 是数组的长度,MAX_NUM是数组中元素的范围,大家可具体调整数组长度来对比排序效率。本人测试得出结论快排和归并排序是最快的。测试数组为一亿个数,大家自己修改数值体验一下吧!
#include <iostream>
#include <cstdio>
#include <ctime>
using namespace std;
#define MAX_LEN 10
#define MAX_NUM 10
#define random(num) (rand()%num)
#pragma region 打印数组
void printArr(int *arr, int size)
{
for (int i = 0; i <= size; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
#pragma endregion
#pragma region 交换函数
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
#pragma endregion
#pragma region 冒泡排序
void bublleSort(int *arr, int size)
{
for (int i = 0; i < size; ++i)
{
for (int j = size; j>i; --j)
{
if (arr[j] < arr[j - 1])
{
swap(arr[j], arr[j - 1]);
}
}
}
}
#pragma endregion
#pragma region 插入排序
void insertSort(int *arr, int size)
{
for (int i = 1; i <= size; ++i)
{
int j = i;
int temp = arr[i];
for (; j > 0 && arr[j - 1] > temp; --j)
{
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
#pragma endregion
#pragma region 希尔排序
void shellSort(int *arr, int size)
{
int gap = size / 2;
while (gap > 0)
{
for (int i = gap; i <= size; i += gap)
{
int j = i;
int temp = arr[i];
for (; j > 0 && arr[j - gap] > temp; j -= gap)
{
arr[j] = arr[j - gap];
}
arr[j] = temp;
}
gap /= 2;
}
}
#pragma endregion
#pragma region 选择排序
void selectSort(int *arr, int size)
{
for (int i = 0; i <= size; ++i)
{
int minIndex = i;
for (int j = i + 1; j <= size; ++j)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
if (i != minIndex)
{
swap(arr[i], arr[minIndex]);
}
}
}
#pragma endregion
#pragma region 快速排序
int insertMid(int *arr, int left, int right)
{
int i = left;
int j = right;
int temp = arr[i];
while (i < j)
{
while (i < j && arr[j] > temp)
--j;
if (i < j)
arr[i++] = arr[j];
while (i < j && arr[i] < temp)
++i;
if (i < j)
arr[j--] = arr[i];
}
arr[i] = temp;
return i;
}
void quikSort(int *arr, int l, int r)
{
if (l < r)
{
int mid = insertMid(arr, l, r);
quikSort(arr, l, mid - 1);
quikSort(arr, mid + 1, r);
}
}
#pragma endregion
#pragma region 堆排序
void adjustHeap(int *arr, int i, int size)
{
if (2 * i + 1 <= size)
{
int maxi = i;
if (arr[2 * i + 1] > arr[maxi])
{
maxi = 2 * i + 1;
}
if (2 * i + 2 <= size && arr[2 * i + 2] > arr[maxi])
{
maxi = 2 * i + 2;
}
if (maxi != i)
{
swap(arr[maxi], arr[i]);
adjustHeap(arr, maxi, size);
}
}
}
void buildHeap(int *arr, int size)
{
for (int i = (size - 1) / 2; i >= 0; --i)
{
adjustHeap(arr, i, size);
}
}
void heapSort(int *arr, int size)
{
buildHeap(arr, size);
for (int i = size; i >= 1; --i)
{
swap(arr[i], arr[0]);
buildHeap(arr, i - 1);
}
}
#pragma endregion
#pragma region 归并排序
void mergeArr(int *arr, int left, int mid, int right, int *temp)
{
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right)
{
if (arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while (i <= mid)
{
temp[k++] = arr[i++];
}
while (j <= right)
{
temp[k++] = arr[j++];
}
for (i = 0; i < k; ++i)
{
arr[left + i] = temp[i];
}
}
void mergeSort(int *arr, int left, int right, int *temp)
{
if (left < right)
{
int mid = (left + right) / 2;
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
mergeArr(arr, left, mid, right, temp);
}
}
#pragma endregion
// 全局数组分配到
int arr1[MAX_LEN] = { 0 };
int arr2[MAX_LEN] = { 0 };
int main(void)
{
srand(time(NULL));
//int *arr1 = (int*)malloc(sizeof(int)*MAXLEN);
//int *arr2 = (int*)malloc(sizeof(int)*MAXLEN);
for (int i = 0; i < MAX_LEN; ++i)
{
arr1[i] = random(MAX_NUM);
}
long _start;
long _end;
memcpy(arr2, arr1, MAX_LEN*sizeof(int));
_start = clock();
quikSort(arr2, 0, MAX_LEN - 1);
_end = clock();
cout << "快速排序: " << _end - _start << endl;
int *arrTemp = (int*)malloc(sizeof(int)*MAX_LEN);
memcpy(arr2, arr1, MAX_LEN*sizeof(int));
_start = clock();
mergeSort(arr2, 0, MAX_LEN - 1, arrTemp);
_end = clock();
cout << "归并排序: " << _end - _start << endl;
memcpy(arr2, arr1, MAX_LEN*sizeof(int));
_start = clock();
heapSort(arr2, MAX_LEN - 1);
_end = clock();
cout << "堆排序: " << _end - _start << endl;
memcpy(arr2, arr1, sizeof(arr1));
_start = clock();
insertSort(arr2, MAX_LEN - 1);
_end = clock();
cout << "插入排序: " << _end - _start << endl;
memcpy(arr2, arr1, sizeof(arr1));
_start = clock();
shellSort(arr2, MAX_LEN - 1);
_end = clock();
cout << "希尔排序: " << _end - _start << endl;
memcpy(arr2, arr1, sizeof(arr1));
_start = clock();
selectSort(arr2, MAX_LEN - 1);
_end = clock();
cout << "选择排序: " << _end - _start << endl;
memcpy(arr2, arr1, MAX_LEN*sizeof(int));
_start = clock();
bublleSort(arr2,MAX_LEN - 1);
_end = clock();
cout << "冒泡排序: " << _end - _start << endl;
return 0;
}