各类排序算法时间比较

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

// 交换数组两个元素
void swap(int *arr, int p, int e)
{
    int tmp = arr[p];
    arr[p] = arr[e];
    arr[e] = tmp;
}

// 冒泡排序
// arr - 数组
// p - 开始下标
// e - 结束下标
void bubble_sort(int *arr, int p, int e)
{
    int i, j;
    for (i = p; i < e-1; i++)
    {
        for (j = e-1; j >i; j--)
            if (arr[j] < arr[j-1])
            {
                swap(arr, j, j-1);
            }
    }
}

// 插入排序
// arr - 数组
// p - 开始下标
// e - 结束下标
void insert_sort(int *arr, int p, int e)
{
    int i, j, k, tmp;
    for (i =p+1; i < e; i++)
    {
        for (j = 0; j < i; j++)
        {
            if (arr[i] < arr[j])
            {
                tmp = arr[i];
                for (k = i; k > j; k--)
                {
                    arr[k] = arr[k-1];
                }
                arr[j] = tmp;
                break;
            }
        }
    }
}


// 快速排序
// arr - 数组
// p - 开始下标
// e - 结束下标
void quick_sort(int *arr, int p, int e)
{
    int i;
    if (p >= e) return;
    int m = p;
    for (i = m+1; i < e; i++)
    {
        if (arr[i] < arr[p])
            swap(arr, ++m, i);
    }
    swap(arr, m, p);
    quick_sort(arr, m+1, e);
    quick_sort(arr, p, m);
}

// 归并排序
// arr - 数组
// p - 开始下标
// e - 结束下标
int tmp[100000];
void merge_sort(int *arr, int p, int e)
{
    if (p >= e-1)
        return ;
    int m = (p+e) / 2;
    merge_sort(arr, p, m);
    merge_sort(arr, m, e);
    int i = p;
    int j = m;
    int k = 0;
    while(i < m && j < e)
    {
        if (arr[i] <= arr[j])
        {
            tmp[k++] = arr[i++];
        }
        else
        {
            tmp[k++] = arr[j++];
        }
    }
    while (i < m)
        tmp[k++] = arr[i++];
    while (j < e)
        tmp[k++] = arr[j++];
    for (i = 0; i < k; i++)
    {
        arr[p+i] = tmp[i];
    }
}
// 选择排序
// arr - 数组
// p - 开始下标
// e - 结束下标
void select_sort(int *arr, int p, int e)
{
    int i, j, k;
    for (i = p; i < e-1; i++)
    {
        k = i;
        for (j = i+1; j < e; j++)
        {
            if (arr[j] < arr[k])
                k = j;
        }
        if (k != i)
            swap(arr, k, i);
    }
}

// 堆排序
// arr - 数组
// p - 开始下标
// e - 结束下标
void heap_sort(int *arr, int p, int e)
{
    int i;
    int * heap = new int[5001];
    int size = 0;
    // 建堆
    for (i = p; i < e; i++)
    {
        int hole = ++size;
        for (;heap[hole/2] > arr[i] && hole > 1; hole/=2)
            heap[hole] = heap[hole/2];
        heap[hole] = arr[i];
    }
    // 出堆
    int head, hole, child, tmp;
    i = 0;
    while(size > 0)
    {
        head = heap[1];
        hole = 1;
        tmp = heap[size--];
        for (; hole * 2 <= size; hole = child)
        {
            child = hole * 2;
            if (heap[child+1] < heap[child]) child++;
            if (heap[child] > tmp) break;
            else heap[hole] = heap[child];
        }
        heap[hole] = tmp;
        arr[i++] = head;
    }
}

// 复制数组
void copy(int *dst, int *src)
{
    for (int i = 0; i < 5000; i++)
        dst[i] = src[i];
}

// 测试各种排序算法时间
void test()
{
    int arr[5000];
    // 产生随机数
    int i;
    time_t t;
    srand((unsigned)time(&t));
    for (i = 0; i < 5000; i++)
        arr[i] = rand()%(1000000+1);
    // 测试时间
    int a[5000];
    long beginTime;
    long endTime;
    // 冒泡排序
    copy(a,arr);
    beginTime = clock();
    bubble_sort(a, 0, 5000);
    endTime = clock();
    cout<<"冒泡排序: "<<endTime-beginTime<<"ms"<<endl;
   
    // 插入排序
    copy(a, arr);
    beginTime = clock();
    insert_sort(a, 0, 5000);
    endTime = clock();
    cout<<"插入排序: "<<endTime-beginTime<<"ms"<<endl;

    // 快速排序
    copy(a, arr);
    beginTime = clock();
    quick_sort(a, 0, 5000);
    endTime = clock();
    cout<<"快速排序: "<<endTime-beginTime<<"ms"<<endl;

    // 归并排序
    copy(a, arr);
    beginTime = clock();
    merge_sort(arr, 0, 5000);
    endTime = clock();
    cout<<"归并排序: "<<endTime-beginTime<<"ms"<<endl;

    // 选择排序
    copy(a, arr);
    beginTime = clock();
    select_sort(arr, 0, 5000);
    endTime = clock();
    cout<<"选择排序: "<<endTime-beginTime<<"ms"<<endl;

    // 堆排序
    copy(a, arr);
    beginTime = clock();
    heap_sort(arr, 0, 5000);
    endTime = clock();
    cout<<"堆排序: "<<endTime-beginTime<<"ms"<<endl;
}

int main()
{
    cout<<"从小到大排序5000个随机数据,各类排序算法时间: "<<endl;
    test();
}

 

{9)[%N1@FTVEAS79A5MVSY2

转载于:https://my.oschina.net/skyhacker2/blog/167843

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值