文章目录
【 1. 基本原理 】 【 2. sort 的应用 】
函数名 用法 sort (first, last) 基于 快速排序 ,对容器或普通数组中 [ first, last ) 范围内的元素进行排序,默认进行升序排序 (从小到大 )。 stable_sort (first, last) 和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。 partial_sort (first, middle, last) 从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。 partial_sort_copy (first, last, result_first, result_last) 从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。 is_sorted (first, last) 检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。 is_sorted_until (first, last) 和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。 void nth_element (first, nth, last) 找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。
【 1. 基本原理 】
sort() 函数位于 <algorithm>头文件 中。 sort() 函数 的适用条件 sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:
容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持 < 小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该排序规则底层实现所用的比较运算符 ; 如果sort() 函数在实现 排序时,需要交换容器中元素的存储位置 。这种情况下,如果容器中存储的是自定义的类对象 ,则该 类的内部必须提供移动构造函数和移动赋值运算符 。 对于指定区域内 值相等的元素 ,sort() 函数 无法保证它们的相对位置不发生改变 。例如,有如下一组数据: 2 1 2 3 2 可以看到,该组数据中包含多个值为 2 的元素。此时如果使用 sort() 函数进行排序,则值为 2 的这 3 个元素的相对位置可能会发生改变,排序结果为: 1 2 2 2 3 可以看到,原本红色的元素 2 位于绿色 2 和黑色 2 的左侧,但经过 sort() 函数排序之后,它们的相对位置发生了改变,即红色 2 移动到了绿色 2 和黑色 2 的右侧。
实际场景中,如果需要 保证值相等元素的相对位置不发生改变 ,可以选用 stable_sort() 排序函数。
sort 的执行效率 sort() 函数的效率怎么样吗?该函数实现排序的 平均时间复杂度为
N
l
o
g
2
N
Nlog_2N
Nl o g 2 N (其中 N 为指定区域 [first, last) 中 last 和 first 的距离)。
【 2. sort 的应用 】
C++ STL 标准库中的 sort() 函数,本质就是一个模板函数,该函数专门用来对容器或普通数组中指定范围内的元素进行升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>降序排序规则),甚至还可以自定义排序规则。
first 和 last 都为随机访问迭代器,它们的组合 [first, last) 用来指定要排序的目标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater<T>),也可以是自定义的排序规则。 对 [first, last) 区域内的元素做默认的升序排序
void sort ( RandomAccessIterator first, RandomAccessIterator last) ;
按照指定的 降序排序规则,对 [first, last) 区域内的元素进行排序。
void sort ( RandomAccessIterator first, RandomAccessIterator last, greater < int > ( ) ) ;
实例 - sort 函数实现 升序排序和降序排序
# include <iostream>
# include <algorithm>
# include <vector>
using namespace std;
int main ( )
{
vector< int > myvector{ 32 , 71 , 12 , 45 , 26 , 80 , 53 , 33 } ;
sort ( myvector. begin ( ) , myvector. begin ( ) + 4 ) ;
for ( vector< int > :: iterator it = myvector. begin ( ) ; it != myvector. begin ( ) + 4 ; ++ it) {
cout << * it << ' ' ;
}
cout << endl;
sort ( myvector. begin ( ) , myvector. begin ( ) + 4 , greater < int > ( ) ) ;
for ( vector< int > :: iterator it = myvector. begin ( ) ; it != myvector. begin ( ) + 4 ; ++ it) {
cout << * it << ' ' ;
}
return 0 ;
}