首页 > 编程语言 >使用benchmark比较各排序算法的性能

使用benchmark比较各排序算法的性能

时间:2023-04-10 20:57:21浏览次数:34  
标签:sort auto void benchmark 算法 vector array 排序 size

#include <benchmark/benchmark.h>

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

using namespace std;

static const int _num = 10000;
static const int _lrange = 0;
static const int _rrange = 100;
static const int _iter = 1;

vector<int> test_array = vector<int>(_num);

void init() {
   random_device rd;
   mt19937 gen(rd());
   uniform_int_distribution<int> dist(_lrange, _rrange);
   for (int i = 0; i < _num; ++i) {
      test_array.emplace_back(dist(gen));
   }
}

template <class T>
void selection_sort(vector<T>& _array);
static void BM_selection_sort(benchmark::State& state) {
   for (auto _ : state) {
      selection_sort(test_array);
   }
}
BENCHMARK(BM_selection_sort)->Iterations(_iter);

template <class T>
void bubble_sort(vector<T>& _array);
static void BM_bubble_sort(benchmark::State& state) {
   for (auto _ : state) {
      bubble_sort(test_array);
   }
}
BENCHMARK(BM_bubble_sort)->Iterations(_iter);

template <class T>
void comb_sort(vector<T>& _array);
static void BM_comb_sort(benchmark::State& state) {
   for (auto _ : state) {
      comb_sort(test_array);
   }
}
BENCHMARK(BM_comb_sort)->Iterations(_iter);

template <class T>
void insertion_sort(vector<T>& _array);
static void BM_insertion_sort(benchmark::State& state) {
   for (auto _ : state) {
      insertion_sort(test_array);
   }
}
BENCHMARK(BM_insertion_sort)->Iterations(_iter);

template <class T>
void shell_sort(vector<T>& _array);
static void BM_shell_sort(benchmark::State& state) {
   for (auto _ : state) {
      shell_sort(test_array);
   }
}
BENCHMARK(BM_shell_sort)->Iterations(_iter);

template <class T>
void heap_sort(vector<T>& _array);
static void BM_heap_sort(benchmark::State& state) {
   for (auto _ : state) {
      heap_sort(test_array);
   }
}
BENCHMARK(BM_heap_sort)->Iterations(_iter);

template <class T>
void Merge_sort(vector<T>& _array);
static void BM_Merge_sort(benchmark::State& state) {
   for (auto _ : state) {
      Merge_sort(test_array);
   }
}
BENCHMARK(BM_Merge_sort)->Iterations(_iter);

template <class T>
void Quick_sort(vector<T>& _array);
static void BM_Quick_sort(benchmark::State& state) {
   for (auto _ : state) {
      Quick_sort(test_array);
   }
}
BENCHMARK(BM_Quick_sort)->Iterations(_iter);

template <class T>
void STL_sort(vector<T>& _array);
static void BM_STL_sort(benchmark::State& state) {
   for (auto _ : state) {
      STL_sort(test_array);
   }
}
BENCHMARK(BM_STL_sort)->Iterations(_iter);

int main(int argc, char** argv) {
   init();
   ::benchmark::Initialize(&argc, argv);
   ::benchmark::RunSpecifiedBenchmarks();
}

template <class T>
void selection_sort(vector<T>& _array) {
   size_t begin = 0, end = _array.size() - 1;
   while (begin < end) {
      int min_index = begin, max_index = begin;
      for (size_t i = begin; i <= end; i++) {
         if (_array[i] < _array[min_index]) min_index = i;
         if (_array[i] > _array[max_index]) max_index = i;
      }
      swap(_array[begin], _array[min_index]);
      swap(_array[end], _array[max_index]);
      begin++;
      end--;
   }
}

template <class T>
void bubble_sort(vector<T>& _array) {
   for (size_t i = 0; i < _array.size() - 1; i++)
      for (size_t j = 0; j < _array.size() - 1 - i; j++)
         if (_array[j] > _array[j + 1]) swap(_array[j], _array[j + 1]);
}

template <class T>
void comb_sort(vector<T>& _array) {
   auto gap = _array.size();
   while (gap >= 1) {
      gap = gap / 1.247331;
      for (size_t i = 0; i < _array.size() - gap; i++)
         if (_array[i] > _array[i + gap]) swap(_array[i], _array[i + gap]);
   }
}

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

template <class T>
void shell_sort(vector<T>& _array) {
   auto gap = _array.size();
   while (gap > 1) {
      // gap = gap / 2;
      gap = gap / 3 + 1;
      for (auto j = gap; j < _array.size(); j++) {
         auto key = _array[j];
         auto i = j - gap;
         while (i < _array.size() && key < _array[i]) {
            _array[i + gap] = _array[i];
            i -= gap;
         }
         _array[i + gap] = key;
      }
   }
}

template <class T>
void heap_sort(vector<T>& _array) {
   make_heap(_array.begin(), _array.end());
   sort_heap(_array.begin(), _array.end());
}

template <class T>
void merge(vector<T>& _array, const size_t left, const size_t right,
                const 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, const size_t left, const 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>());
   }
}

template <class T>
void Merge_sort(vector<T>& _array) {
   merge_sort(_array, 0, _array.size() - 1);
}

template <class T>
void quick_sort(vector<T>& _array, const size_t begin, const size_t end) {
   auto key = _array[begin];
   auto left = begin, right = end;
   while (left < right) {
      while (_array[right] >= key && left < right) right--;
      _array[left] = _array[right];
      while (_array[left] <= key && left < right) left++;
      _array[right] = _array[left];
   }
   auto& middle = left;
   _array[middle] = key;
   if (begin < (middle - 1) && middle != 0)
      quick_sort(_array, begin, middle - 1);
   if (middle + 1 < end) quick_sort(_array, middle + 1, end);
}

template <class T>
void Quick_sort(vector<T>& _array) {
   quick_sort(_array, 0, _array.size() - 1);
}

template <class T>
void STL_sort(vector<T>& _array) {
   sort(_array.begin(), _array.end());
}

标签:sort,auto,void,benchmark,算法,vector,array,排序,size
From: https://www.cnblogs.com/fjnhyzCYL/p/17304254.html

相关文章

  • 直线光栅化-Bresenham算法
    直线光栅化-Bresenham算法Bresenham算法对于两个顶点\(P_{1}(x_{1},y_{1})\)和\(P_{2}(x_{2},y_{2})\)满足\(\Deltax=x_{2}-x_{1}>0\)且\(\Deltay=y_{2}-y_{1}>0\)。设两点确定的直线方程的斜率为\(k=\frac{\Deltay}{\Deltax}\)。当\(0<k<1\)时,从\(x\)轴开始......
  • 基于深度学习网络的5G通信链路信道估计算法matlab仿真
    1.算法描述        深度学习(英语:deeplearning),是一个多层神经网络是一种机器学习方法。在深度学习出现之前,由于诸如局部最优解和梯度消失之类的技术问题,没有对具有四层或更多层的深度神经网络进行充分的训练,并且其性能也不佳。但是,近年来,Hinton等人通过研究多层神经网络,......
  • KMP算法(串的模式匹配算法)(未完待续......)
    KMP算法的实现1.基本原理  在暴力破解算法(BF算法)中,模式串需要一个一个来跟主串进行对比,若有一个不相同,则主串前进一位,继续从头开始进行比较,这样比较的最坏时间复杂度为O(mn),例:‘aaaaaaaaab’和‘aaab’,需要比较到最后一个才能成功,效率太过低下。  KMP算法的原理是,找到模式串......
  • 基于FastICA算法的混合信号解混合信号恢复仿真
    1.算法描述       独立成分分析(IndependentComponentAnalysis,ICA)是近年来提出的非常有效的数据分析工具,它主要用来从混合数据中提取出原始的独立信号。它作为信号分离的一种有效方法而受到广泛的关注。近几年出现了一种快速ICA算法(FastICA),该算法是基于定点递推算法......
  • 快速排序
    1.快速排序思想:分治算法 三步骤:1.找一个分界值x;       2.将小于等于x的放在左边,将大于等于x的放在右边;      3。递归左右两边;    #include<iostream>usingnamespacestd;constintN=1e5+10;voidquick_sort(intq[],intl,intr)......
  • R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
    全文链接:http://tecdat.cn/?p=32092原文出处:拓端数据部落公众号我们一般把一件事情发生,对另一件事情也会产生影响的关系叫做关联。而关联分析就是在大量数据中发现项集之间有趣的关联和相关联系(形如“由于某些事件的发生而引起另外一些事件的发生”)。我们的生活中有许多关联,一......
  • opencv-python 4.16. 基于GrabCut算法的交互式前景提取
    理论GrabCut算法由英国剑桥微软研究院的CarstenRother,VladimirKolmogorov和AndrewBlake设计。在他们的论文:"GrabCut":interactiveforegroundextractionusingiteratedgraphcuts中提出了一种基于最小用户交互的前景提取算法,其结果为GrabCut。从用户的角度来看,它是如何工......
  • 8、快速排序
    1、单路快速排序单路快速排序:O(N*logN)当数组中的元素一致时退化为O(n2)publicclassQuickSort{privatestaticfinalRandomRANDOM=newRandom();privateQuickSort(){}/***快速排序*/publicstatic<EextendsComparable......
  • 7、归并排序
    1、归并排序归并排序:O(N*logN)publicclassMergeSort{privateMergeSort(){}/***归并排序*/publicstatic<EextendsComparable<E>>voidsort(E[]arr){sort(arr,0,arr.length-1);}/***归并排序ar......
  • 关于滑动窗口算法的应用场景
    算法原理滑动窗口算法是一种基于双指针(又称滑动窗口)的算法,是一种常用的数据处理算法,通常用于解决数组或字符串中的子数组或子串问题。滑动窗口算法的基本思想是使用两个指针left和right来定义一个窗口,窗口内包含满足特定条件的元素子序列,然后不断移动指针left和right来滑动窗口,......