C++ algorithm Sorting

本文详细介绍了C++中algorithm库的排序函数,包括sort、stable_sort、partial_sort、partial_sort_copy、is_sorted、is_sorted_until以及nth_element。强调了sort和stable_sort在稳定性上的区别,并给出了各个函数的使用示例和输出结果。
摘要由CSDN通过智能技术生成

C++ algorithm Sorting

这一部分是有关于排序的。

函数名 函数功能
sort 对范围内的元素进行排序(不稳定)
stable_sort 对范围内的元素进行排序(稳定)
partial_sort 排序部分范围内的元素
partial_sort_copy 排序并复制部分范围内的元素
is_sorted 检查范围是否已排序
is_sorted_until 查找范围内的第一个未排序元素
nth_element 对范围内的元素进行排序(特殊)

sort

将 [first,last) 范围中的元素按升序排序。

不保证等效元素保持其原始相对顺序。(排序不稳定)

sort 共有两个版本:

//第一个版本,如果写了 Compare 方法,即需要使用这个方式。
//第一参数为 first 迭代器,第二参数为 last 迭代器,第三参数为 Compare 方法
template <class _RanIt, class _Pr>
void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) {
    // order [_First, _Last), using _Pred
    _Adl_verify_range(_First, _Last);
    const auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast  = _Get_unwrapped(_Last);
    _Sort_unchecked(_UFirst, _ULast, _ULast - _UFirst, _Pass_fn(_Pred));
}
//第二个版本,该版本事实上就是使用了第一个版本,如果重载操作符 < ,即可改变第三参数的比较方式。
template <class _RanIt>
void sort(const _RanIt _First, const _RanIt _Last) {
    // order [_First, _Last), using operator<
    _STD sort(_First, _Last, less<>());
}

使用 cmp 则使用第一个版本,使用重载 < 则使用第二个版本。

stable_sort

将范围中的元素 [first,last) 按升序排序。

保证等效元素保持其原始相对顺序。(排序稳定)

stable_sort 共有两个版本:

//第一个版本,如果写了 Compare 方法,即需要使用这个方式。
//第一参数为 first 迭代器,第二参数为 last 迭代器,第三参数为 Compare 方法
template <class _BidIt, class _Pr>
void stable_sort(const _BidIt _First, const _BidIt _Last, _Pr _Pred) {
   
    // sort preserving order of equivalents, using _Pred
    _Adl_verify_range(_First, _Last);
    const auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast  = _Get_unwrapped(_Last);
    const auto _Count  = _STD distance(_UFirst, _ULast);
    if (_Count <= _ISORT_MAX) {
   
        if (_Count > 1) {
   
            _Insertion_sort_unchecked(_UFirst, _ULast, _Pass_fn(_Pred));
        }

        return;
    }

    _Optimistic_temporary_buffer<_Iter_value_t<_BidIt>> _Temp_buf{
   _Count - (_Count >> 1)};
    _Stable_sort_unchecked(_UFirst, _ULast, _Count, _Temp_buf._Data, _Temp_buf._Capacity, _Pass_fn(_Pred));
}
//第二个版本,该版本事实上就是使用了第一个版本,如果重载操作符 < ,即可改变第三参数的比较方式。
template <class _BidIt>
void stable_sort(const _BidIt _First, const _BidIt _Last) {
    // sort preserving order of equivalents, using operator<
    _STD stable_sort(_First, _Last, less<>());
}

使用 cmp 则使用第一个版本,使用重载 < 则使用第二个版本。

sort 和 stable_sort 的区别:

sort 排序不稳定,stable_sort 排序稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值