std中稳定排序算法_转载:在STL泛型算法中的排序函数sort内部使用的是哪种排序算法呢?...

本文探讨了C++标准库中用于排序的几种算法,包括sort()、stable_sort()、partial_sort()以及特定容器如list::sort()和set的排序。稳定排序算法如stable_sort()在处理等价元素时能保持它们的相对顺序,而sort()在某些情况下可能会改变这种顺序。性能方面,sort()通常最快,而stable_sort()由于稳定性的要求可能会慢一些。partial_sort()用于排序部分元素,通常比全排序更高效。此外,对于特定数据类型,如string,排序时直接操作指针(如list::sort())可能比拷贝元素更快。最后,文章指出,尽管sort()和qsort()在C++中都可用,但sort()通常更优,qsort()仅适用于C语言的向后兼容。
摘要由CSDN通过智能技术生成

转载:在STL泛型算法中的排序函数sort内部使用的是哪种排序算法呢?

(2011-09-02 16:18:54)

标签:

杂谈

当你有一个数据序列时,你最想做的操作之一就是排序。将数据排序使得它易于被人理解,而且排序是许多泛型算法的第一步--即使是计算一系列数字的和这样的微末算法。每个编程系统都提供了几种形式的排序;标准C++运行库提供了6种!(或可能更多,这取决于你怎么数了。)他们有多么大的差异,并且什么时候你该使用其中某一个而不是另外的那些?

用泛型算法进行排序

C++标准24章有一个小节叫“Sorting and related

operations”。它包含了很多对已序区间进行的操作,和三个排序用泛型算法:sort(),stable_sort(),和partial_sort()。

前两个,sort()和stable_sort(),本质上有相同的接口:同通常的STL泛型算法一样,传入指明了需要排序的区间的Random

Access Iterator。

同样,作为可选项,你也能提供第三个参数以指明如何比较元素:第三个参数是一个functor,接受两个参数(x和y),在x应该位于y之前时返回true。所以,举例来说,如果v是一个int的vector:

std::sort(v.begin(), v.end());

将以升序来排序它。要改为降序,你需要提供应该不同的比较方法:

std::sort(v.begin(), v.end(), std::greaterint());

注意,我们正在以greater作为第三参数,而不是greater_equal。这很重要,它是所有STL排序算法的前提条件:比较函数必须在两个参数相同时返回false(WQ注:参看《Effective

STL》Item

21)。在某种程度上,这太武断了:看起来完全可以随便使用“”或者“=”这样形式的比较函数来表达一个排序算法的。然而,作出明确的选择是必需的,并且要始终坚持这个选择。标准C++运行库选择了前者。如果你传给sort()一个对等价的参数返回true的functor,你将得到不可预知的、完全依赖于具体实现的结果;在某些系统下,它看起来能工作,而在另外一些系统下可能导致无限循环或内存保护错误。

对于比较简单的场合,使用stable_sort()代替sort(),你不会看出很多差异。与sort()一样,stable_sort()对[first,

last)区间进行排序,默认是升序,并且,同样你可以提供一个比较函数以改变顺序。如果你读过C++标准,你将会看到sort()和stable_sort()的两个不同:

l

如名字所示,stable_sort()是稳定的。如果两个元素比较结果为等价,stable_sort()不改变它们的相对顺序。

l 性能上的承诺是不同的。

第一点,稳定,比较容易懂。它对int类型通常无所谓(一个“42”和另外一个“42”完全相同),但有时对其它数据类型就非常重要了。比如,你正对task根据优先级排序,你或许期望高优先级的task被提到低优先级的task之前,但相同优先级的任务保持它们原来的先后顺序。sort()没有这个承诺,而stable_sort()承诺了这一点。

标准对性能的描述就不怎么直观了:sort()和stable_sort()的承诺都很复杂,并且都不完备。标准说sort()的“平均”复杂度是O(N

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值