各种排序算法汇总(测试算法具体时间和效率)

这篇博文是对前面集中排序算法的具体测试,采用所有算法排序同一样本随机数组来测试算法具体的效率。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;
}

你可能感兴趣的:(排序算法,排序算法汇总)