类别:算法 | 组件类型:函数 |
template <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last); template <class RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);
的两个版本排序在如何定义一个元素是否小于另一个元素方面有所不同。第一个版本使用operator<比较对象,第二个版本使用函数对象comp.
int A[] = {1, 4, 2, 8, 5, 7}; const int N = sizeof(A) / sizeof(int); sort(A, A + N); copy(A, A + N, ostream_iterator<int>(cout, " ")); // The output is " 1 2 4 5 7 8".
[1] 如果您正在对具有多个字段的记录进行排序,则稳定排序有时很重要:例如,您可能希望按姓氏,然后按名字对人员列表进行排序。算法stable_sort确实保证保留等价元素的相对顺序。
[2] 早期版本的排序使用快速排序算法(C. A. R. Hoare,Comp. J. 5,1962),使用由三个数的中位数选择的枢轴(R. C. Singleton,CACM 12,1969)。快速排序具有O(N log(N))平均复杂度,但最坏情况复杂度为二次方。有关讨论,请参见 Knuth 的第 5.2.2 节。(D. E. Knuth,计算机程序设计艺术。第 3 卷:排序和查找。Addison-Wesley,1975。)当前的实现排序但是,使用introsort算法(D. R. Musser,“内省排序和选择算法”,软件实践与经验 27(8):983, 1997。)其最坏情况复杂度为O(N log(N))。Introsort 与三数中位数快速排序非常相似,并且平均速度至少与快速排序一样快。