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 排序稳定。