首页 > 其他分享 >基于 concept 的归并排序

基于 concept 的归并排序

时间:2024-03-12 20:33:19浏览次数:16  
标签:std begin concept end temp comp 归并 mid 排序

基于 concept 的归并排序

template <std::random_access_iterator RandomIter,
          std::random_access_iterator RandomTempIter, typename Comp>
  requires requires(Comp comp, RandomIter it, RandomTempIter tmp_it) {
    { comp(*it, *it) } -> std::same_as<bool>;
    { comp(*tmp_it, *tmp_it) } -> std::same_as<bool>;
  }
constexpr auto MergeSort(RandomIter begin, RandomIter end,
                         RandomTempIter temp_begin, RandomTempIter temp_end,
                         Comp &&comp) -> void {
  if (begin + 1 == end) {
    return;
  }

  auto mid = begin + (end - begin) / 2;
  auto temp_mid = temp_begin + (temp_end - temp_begin) / 2;
  MergeSort(begin, mid, temp_begin, temp_mid, std::forward<Comp>(comp));
  MergeSort(mid, end, temp_mid, temp_end, std::forward<Comp>(comp));

  auto left_it = begin, right_it = mid;
  auto tit = temp_begin;
  while (left_it < mid && right_it < end) {
    if (comp(*left_it, *right_it)) {
      *tit = std::move(*left_it);
      ++left_it;
    } else {
      *tit = std::move(*right_it);
      ++right_it;
    }
    ++tit;
  }
  while (left_it < mid) {
    *tit = std::move(*left_it);
    ++tit;
    ++left_it;
  }
  while (right_it < end) {
    *tit = std::move(*right_it);
    ++tit;
    ++right_it;
  }

  while (begin < end) {
    *begin = std::move(*temp_begin);
    ++begin;
    ++temp_begin;
  }
}

template <std::random_access_iterator Iter, typename Comp>
  requires requires(Comp comp, Iter it) {
    { comp(*it, *it) } -> std::same_as<bool>;
  }
constexpr auto MergeSort(Iter begin, Iter end, Comp &&comp) -> void {
  std::vector<typename std::iterator_traits<Iter>::value_type> buffer(end -
                                                                      begin);
  MergeSort(begin, end, std::begin(buffer), std::end(buffer),
            std::forward<Comp>(comp));
}

标签:std,begin,concept,end,temp,comp,归并,mid,排序
From: https://www.cnblogs.com/FlandreScarlet/p/18069214

相关文章

  • JAVA实现算法问题25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排
    JAVA实现算法问题25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛随机数模拟25匹马匹速度importjava.lang.reflect.Array;importjava.util.Arrays;publicclassMa{publicstaticvoidmain(String[]args){......
  • 【数据结构】排序
    文章目录一、排序的概念及引用1、排序的概念2、常见的排序算法二、常见排序算法的实现1、插入排序2、直接插入排序一、排序的概念及引用1、排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排......
  • 深入理解快速排序
    一、快速排序    快速排序是冒泡排序的一种改进算法,相比于冒泡排序效率更优。算法过程分析:    通过采用分治策略,围绕一个x 将原始数组划分为两个子数组,使得前一个子数组的元素≤x≤后一个子数组元素,对两个子数组进行递归排序,再合并成一个有序数组。 ......
  • ABAP SALV-排序、过滤
    01功能说明上篇:ABAPSALV-按钮设置、布局设置本系列将通过模拟用户与开发者之间的对话场景,来逐步演示SALV的使用。在本篇中,我们将继续上一篇内容,以解决用户提出的另外两个需求:排序、过滤。让我们来看看是如何实现的吧。赶快动手试一试,掌握它的用法。02功能效果第6天......
  • 【算法】【线性表】【数组】在排序数组中查找元素的第一个和最后一个位置
    1 题目给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,......
  • SQL 多关键字查询并根据匹配程度排序
    --创建测试表IFEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[Score]')ANDtypein(N'U'))DROPTABLE[dbo].[Score]GOCREATETABLE[dbo].[Score]([Id][int]IDENTITY(1,1)NOTNULL,[UserName][nvarchar](50......
  • 关于拓扑排序
    定义拓扑排序在一个DAG(有向无环图)中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点\({u}\)到\({v}\)的有向边\({(u,v)}\),都可以有\({u}\)在\({v}\)的前面。还有给定一个DAG,如果从\({i}\)到\({j}\)有边,则认为\({j}\)依赖于\({i}\)。如果\({i}\)......
  • 快速排序
    快排属于分治算法;思想:快排的思想是分治我们有一个待排序的数组,长度为n。选定一个基准,将数组分成左右两部分,左边的数小于基准,右边的数大于基准。然后我们分别看分割后左右两部分数组,如果元素个数大于1,就再次分割。直到最后,我们得到了n个数组,每个数组含有1个元素。这n个数组......
  • 排序链表(自底向上归并排序)
    题目:时间复杂度:O(nlogn),空间复杂度:O(1)structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};class......
  • pandas - 数据排序
    sort_values()函数importpandasaspddata={'名称':['太阳能','床','风扇','沙发'],'单价':[2000,3500,500,3500],'数量':[58,23,69,60]}df=pd.DataFrame(data)#单条件排序,使......