C/C++快速排序运行时间测试,精确到微秒

#include <iostream>
#include <cmath>
#include <ctime>
#include <cassert>
#include <windows.h> //微妙级计时必须的头文件
using namespace std;

//生成测试数据
namespace MyUtil
{
    //生成数组长度为n,数据范围为[rangl...rangR]的随机数组
    int *generateRandomArray(int n, int rangel, int rangeR)
    {
        assert(n > 0 && rangel <= rangeR);
        int *arr = new int[n];
        srand((unsigned int)time(NULL));
        for (int i = 0; i < n; ++i)
        {
            arr[i] = rand() % (rangeR - rangel + 1) + rangel;
        }
        return arr;
    }
    //生成数组长度为n有序数组
    int *generateOrderedArray(int n)
    {
        assert(n > 0);
        int *arr = new int[n];
        for (int i = 0; i < n; ++i)
        {
            arr[i] = i;
        }
        return arr;
    }
} // namespace MyUtil

//快速排序算法
class MySort
{
public:
    //传入的数据区间为[left...right],内部处理的数据区间为[left...right]
    void static quickSort(int nums[], int left, int right)
    {
        if (left < right)
        {
            //从数组中随机选择一个数据作为基准
            int baseindex = rand() % (right - left) + left;
            int low = left;
            int high = right;
            //将选中的基准数据放到最右端
            swap(nums[baseindex], nums[right]);
            while (left < right)
            {
                //从左向右找到比基准小的数据则停止,此时right指向该数据
                while (left < right && nums[left] <= nums[high])
                {
                    ++left;
                }
                //从右向左找到比基准大的数据则停止,此时left指向该数据
                while (left < right && nums[right] >= nums[high])
                {
                    --right;
                }
                //将两个数据交换位置
                if (left < right)
                    swap(nums[left], nums[right]);
            }
            //将基准数据放到中间分隔位置
            swap(nums[left], nums[high]);
            quickSort(nums, low, left - 1);
            quickSort(nums, left + 1, high);
        }
    }
};

int main(void)
{
	//程序运行时间
    double run_time = 0;
    //以下测试,每次测试计算的时间精确到微秒
    for (int i = 10; i <= 20; i++)
    {
        //计时所需的相关变量
        LARGE_INTEGER start_time; //开始时间
        LARGE_INTEGER end_time;   //结束时间
        double dqFreq;            //计时器频率
        LARGE_INTEGER freq;       //计时器频率
        QueryPerformanceFrequency(&freq);
        dqFreq = (double)freq.QuadPart;

        //快速排序运行时间测试
        int n = pow(2, i);
        int *arr = MyUtil::generateRandomArray(n, 0, 100);
        QueryPerformanceCounter(&start_time); //计时开始
        MySort::quickSort(arr, 0, n - 1);
        QueryPerformanceCounter(&end_time);                            //计时结束
        run_time = (end_time.QuadPart - start_time.QuadPart) / dqFreq; //计时时间计算
        cout << "data size 2^" << i << "=" << n << "\t";
        cout << "time cost:" << run_time << endl;
    }

    cout << "----------------------------------------------" << endl;

    //以下测试,每次测试计算的时间精确到毫秒
    for (int i = 10; i <= 20; i++)
    {
        int n = pow(2, i);
        int *arr = MyUtil::generateRandomArray(n, 0, 100);
        clock_t startTime = clock();
        MySort::quickSort(arr, 0, n - 1);
        clock_t endTime = clock();
        run_time = double(endTime - startTime) / CLOCKS_PER_SEC;
        cout << "data size 2^" << i << "=" << n << "\t";
        cout << "time cost:" << run_time << endl;
    }

    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值