SGI

stable_sort

类别: 算法 组件类型: 函数

原型

Stable_sort是一个重载名称; 实际上有两个stable_sort函数。
template <class RandomAccessIterator>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class StrictWeakOrdering>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last, 
                 StrictWeakOrdering comp);

描述

Stable_sort很像sort: 它对[first, last)中的元素进行升序排序,意味着如果ij[first, last)中的任何两个有效迭代器,使得ij之前,那么*j不小于*i. Stable_sortsort有两个不同之处。首先,stable_sort使用与sort不同的运行时复杂度的算法。其次,顾名思义,stable_sort是稳定的: 它保留了等价元素的相对顺序。也就是说,如果xy[first, last)中的任何两个有效迭代器,使得xy中的元素,并且如果这两个元素是等价的(既不是x < y也不是y < x),那么stable_sort的后置条件是x仍然在y. [1]

之前。这两个版本的stable_sort在如何定义一个元素是否小于另一个元素方面有所不同。第一个版本使用operator<比较对象,而第二个版本使用 函数对象comp.

定义

定义在标准头文件 algorithm 中,以及非标准向后兼容的头文件 algo.h 中。

类型要求

对于第一个版本,即接受两个参数的版本对于第二个版本,即接受三个参数的版本

前提条件

复杂度

Stable_sort是一个自适应算法: 它尝试分配一个临时内存缓冲区,其运行时复杂度取决于可用内存量。最坏情况行为(如果不可用辅助内存)是N (log N)^2比较,其中Nlast - first,最佳情况(如果可用足够大的辅助内存缓冲区)是N (log N). [2]

例子

对字符序列进行排序,忽略其大小写。注意,仅大小写不同的字符的相对顺序将被保留。
inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }

int main()
{
  char A[] = "fdBeACFDbEac";
  const int N = sizeof(A) - 1;
  stable_sort(A, A+N, lt_nocase);
  printf("%s\n", A);
  // The printed result is ""AaBbCcdDeEfF".
}

注意事项

[1] 注意,两个元素可能在不等价的情况下等价。一个标准的例子是对按姓氏排序的姓名序列进行排序: 如果两个人有相同的姓氏,但不同的名字,那么他们就是等价的,但并不相等。这就是为什么stable_sort有时很有用: 如果你要对具有多个不同字段的记录序列进行排序,那么你可能希望按一个字段对它进行排序,而不会完全破坏你之前从按另一个字段对它进行排序获得的排序。例如,你可以按名字排序,然后按姓氏进行稳定排序。

[2] Stable_sort使用归并排序算法; 参见 Knuth 的第 5.2.4 节。(D. E. Knuth,计算机程序设计艺术。第 3 卷: 排序和查找。Addison-Wesley,1975。)

另请参阅

sort, partial_sort, partial_sort_copy, binary_search, lower_bound, upper_bound, less<T>, 严格弱排序, 小于可比较
[Silicon Surf] [STL Home]
Copyright © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息