首页 > 其他分享 >使用benchmark比较插入排序与归并排序性能

使用benchmark比较插入排序与归并排序性能

时间:2023-04-05 09:00:28浏览次数:43  
标签:归并 include 插入排序 benchmark mid state array size left

#include <benchmark/benchmark.h>

#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <random>
#include <string>
#include <vector>

using namespace std;

static const int _num = 3000;                // 待测试的数据量
static const int _range = 100000;            // 待测试的数据大小范围
static const int _iter = 100;                // 迭代运行次数

template <class T>
void insertion_sort(vector<T>& _array) {
    for (size_t j = 1; j < _array.size(); j++) {
        auto key = _array[j];
        size_t i = j - 1;
        while (i >= 0 && _array[i] > key) {
            _array[i + 1] = _array[i];
            i--;
        }
        _array[i + 1] = key;
    }
}

static void BM_demo_1(benchmark::State& state) {
    for (auto _ : state) {
        state.PauseTiming();
        vector<int> a;
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<int> dist(0, _range);
        for (int i = 0; i < _num; ++i) {
            a.push_back(dist(gen));
        }
        state.ResumeTiming();

        insertion_sort(a);
    }
}
BENCHMARK(BM_demo_1)->Iterations(_iter);

template <class T>
void merge(vector<T>& _array, size_t left, size_t right, size_t mid) {
    auto _larray = deque<T>(_array.begin() + left, _array.begin() + mid + 1);
    auto _rarray = deque<T>(_array.begin() + mid + 1, _array.begin() + right + 1);
    for (auto Iter = _array.begin() + left; Iter <= _array.begin() + right;
             Iter++) {
        if (_rarray.empty() == true) {
            *Iter = _larray.front();
            _larray.pop_front();
        } else if (_larray.empty() == true) {
            *Iter = _rarray.front();
            _rarray.pop_front();
        } else {
            if (_larray.front() > _rarray.front()) {
                *Iter = _larray.front();
                _larray.pop_front();
            } else {
                *Iter = _rarray.front();
                _rarray.pop_front();
            }
        }
    }
}

template <class T>
void merge_sort(vector<T>& _array, size_t left, size_t right) {
    if (left != right) {
        size_t mid = size_t((left + right) / 2);
        merge_sort(_array, left, mid);
        merge_sort(_array, mid + 1, right);
        merge(_array, left, right, mid);
        // inplace_merge(_array.begin() + left, _array.begin() + mid + 1,
        //                             _array.begin() + right + 1, greater<T>());
    }
}

static void BM_demo_2(benchmark::State& state) {
    for (auto _ : state) {
        state.PauseTiming();
        vector<int> a;
        random_device rd;
        mt19937 gen(rd());
        uniform_int_distribution<int> dist(0, _range);
        for (int i = 0; i < _num; ++i) {
            a.push_back(dist(gen));
        }
        state.ResumeTiming();

        merge_sort(a, 0, a.size() - 1);
    }
}
BENCHMARK(BM_demo_2)->Iterations(_iter);

BENCHMARK_MAIN();

标签:归并,include,插入排序,benchmark,mid,state,array,size,left
From: https://www.cnblogs.com/fjnhyzCYL/p/17288811.html

相关文章

  • 数据解构之插入排序
    一、插入排序常见三种的排序交换、选择、插入。什么是插入排序?每一趟都要把待排序数放到有序区中合适的位置插入。我们以前是把数,把一个待排序数放到有序区的某一端,这是以前的排序方法。     现在不是了,现在是把待排序数放到有序区当中的合适的位置插入,要注意插入位置的确定......
  • 归并排序-小记
    归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。类比题目:三数求和。......
  • 分治(Divide and Conquer)算法之归并排序
    顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为1的子数组;“......
  • 多路归并
    能解决什么问题一般是给出n个递减的等差数列,要求对于所有等差数列中前m个大的数的和[acwing]1262.鱼塘钓鱼#include<cstdio>#include<cstring>#include<algorithm>#include<queue>usingnamespacestd;typedefpair<int,int>PII;constintN=110;intn......
  • 有关归并排序-Java实现
    有关归并排序:其中的分治思想很值得参考:1/**2*归并排序块合并3*@paramnum目标的排序数组4*@paramleftIndex传入的分治块的做左端索引5*@parammid中间索引6*@paramrightIndex传入的分治块的做右端索引7*@param......
  • 插入排序
    欢迎关注fish的公众号:fish码农成长之旅插入排序的算法实现没有冒泡排序跟选择排序来的那么的直观易懂,但是其算法思想是最容易理解的。通过构建有序序列,对于未排序的序......
  • 插入排序
      代码实现:publicclass插入排序{publicstaticvoidmain(String[]args){int[]array={3,44,38,44,72,54,32,43,242,46,47,56};//定义一......
  • 【算法】排序-归并排序 (java实现)
     packagecom.billkang.algorithm.sort;importjava.util.Arrays;/***归并排序*@authorKangbin*@date2018-11-28*/publicclassMergeSort{publi......
  • 归并排序——C语言描述
    归并排序——C语言描述目录归并排序——C语言描述0测试用例框架1定义(1)算法思想:(2)时间复杂度:(3)空间复杂度:(4)稳定的排序:2代码4测试用例0测试用例框架https://blog.csdn.......
  • benchmark实用命令
    获取所有key:etcdctlget--prefix""--endpoints=192.168.43.104:12379 删除所有key:etcdctldel--prefix""--endpoints=192.168.43.104:12379 查询etcd节......