排序算法有如下:
- sort、stable_sort
- partial_sort、无对应的稳定排序算法
- nth_element、无对应的稳定排序算法
- partition、stable_partition
sort、stable_sort、partitial_sort、nth_element
算法都要求随机访问迭代器,所以这些算法都只能被应用于vector、string、deque和数组。对标准关联容器中的元素进行排序并没有实际意义,因为这样的容器总是使用比较函数来维护内部元素的有效性。list是唯一需要排序却无法使用这些排序算法的容器,为此,list特别提供了sort成员函数。(有趣的是,list::sort执行的是稳定排序)。
如果希望对一个list进行完全排序,那可以用sort成员函数来做到这一点;但是,如果需要对list中的对象使用partial_sort或者nth_elment算法的话,你就只能通过间接途径来完成了。
- 将list中的元素拷贝到一个提供随机访问迭代器的容器中,然后对该容器执行你所期待的算法;
- 先创建一个list::itrator的容器,再对该容器执行相应的算法,然后通过其中的迭代器访问list的元素。
- 利用一个包含迭代器的有序容器中的信息,通过返回调用splice成员函数,将list中的元素调整到期望的目标位置。
与sort、statble_sort、partial_sort、nth_element不同的是,partition
和stable_partition
只要求双向迭代器技能完成工作。
总结一下:
- 如果需要对vector、string、deque或者数组中的元素执行一次完全排序,可以使用sort、stable_sort。
- 如果有一个vector、string、deque或者数组,并且只需要对等价性最前面的n个元素进行排序,那么可以使用partial_sort。
- 如果有一个vector、string、deque或者数组中,并且需要找到第n个位置上的元素,或者,需要找到等价性最前面的n个元素但又不必对这n个元素进行排序,那么nth_element正是你需要的函数。
- 如果需要将一个标准序列容器中的元素是否满足某个特定的条件区分开来,那么partition、stable_partition可能正是你需要的。
- 如果你的数据在一个list中,那么你依然可以直接调用partition、stable_partition算法;你可以用list::sort来代器sort和stable_sort算法。但是,如果你需要获取partial_sort或nth_element算法的效果,那么,正如前面提到的那样,你可以有一些间接的途径来完成这项任务。
总的来说,算法所做的工作越多,它需要的时间也越多;稳定的排序算法要比哪些忽略稳定性的算法更为耗时。建议是对排序算法的选择应该更多地基于你所完成的功能,而不是算法的性能。如果你选择的算法恰好能完成你所需要的功能,那么多数情况下,这不仅可以使你的代码更加清晰,而且也是用STL来完成相应功能最有效的途径。