本节将对我们本章所学到的所有排序模板进行一个总结。读者还记得我们学过哪四个排序函数吗?它们分别是:

排序函数函数功能
sort对指定范围内的元素进行通用、高效的排序。不保证相等元素的原始相对顺序。通常使用内省排序(快速排序+堆排序),平均和最优时间复杂度为O(N log N)。
stable_sort对指定范围内的元素进行稳定排序。保证相等元素在排序后的相对顺序与其在原始序列中的相对顺序一致。当内存充足时,时间复杂度为O(N log N),否则为O(N log² N)。
partial_sort对指定范围内的元素进行部分排序。它重新排列元素,使得前 M 个元素是整个范围内最小的 M 个元素,并且按升序排列。其余元素(后 N-M 个)的顺序未被指定。时间复杂度约为O(N log M)。
nth_element部分排序算法,但目标与partial_sort不同。它重新排列元素,确保位于第 n 个位置的元素(如果范围完全排序后)就位。同时,所有在它之前的元素都不大于它,所有在它之后的元素都不小于它。但这两个子区间内部并没有排序。时间复杂度为O(N)。

从效率看来:nth_lelment()>partial_sort()>sort()>stable_sort()。

我们需要知道,使用这些函数需要求容器支持随机迭代器,切勿对无序关联式容器使用这些函数。

那如何正确地选择它们呢,这取决于问题的排序需求:

1. 如果仅仅是对一个序列进行排序,我们选择sort()或stable_sort()函数就好了。

2. 如果需要排序且排序时不能破坏等同元素的位置,使用stable_sort()函数就好了。

3. 如果我们需要知道排序后靠前的几个元素,使用partial_sort()函数就好了。

4. 如果我们需要知道排序后第几个元素是谁,使用nth_element()函数就好了。

总结:面对不同的排序需求,我们针对性进行排序函数调用即可,就像是对症下药一样;同时,这些函数都需要迭代器参与计算,所以掌握迭代器函数能够更高效地解决我们的问题。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)