【发布时间】:2014-07-18 04:32:56
【问题描述】:
我想知道为什么 c++ 标准要求 std::sort 只应采用随机访问迭代器?我看不出有什么优势,因为std::sort 和std::list::sort 的复杂度都是N*log(N)。将std::sort 限制为随机访问迭代器 (RAI) 似乎使得有必要为具有相同复杂性的列表编写单独的函数。
这同样适用于partial_sort,直到今天,列表is simply missing 的非RAI 对应部分。
这种设计是不是因为人们过去使用quick_sort 的变体来实现std::sort?
如果在 RAI 容器上编写排序算法有优势,是否让std::sort 更通用,让像std::vector 这样的 RAI 容器提供专门的v.sort?
【问题讨论】:
-
你说人们使用快速排序来“历史地”实现 std::sort。您认为他们今天使用什么?
-
@JohnZwinck 他们今天不能使用(未修改的)快速排序。 C++11 标准要求
std::sort在所有情况下都是O(N log N),快速排序是O(N^2)最坏的情况。 -
@JohnZwinck:你确定在 C++ 中
O(N log N)与O(N^2)不同吗?请注意,在 C++ 中,N有一个上限。 -
@6502:你的意思是
SIZE_MAX?按照这个逻辑,所有算法(停止)都是 O(1)。但这不是描述复杂性的非常有用的方式。 -
@6502 原则上您是对的,但我们大多数人默认只计算渐近行为,直到渐近线超出图形并趋向无穷大之前的某一点。显式多项式基本上没有什么不同。系数被加回,但它们仅在一定程度上有效。如果您真的要为现实世界的软件构建模型,您将考虑内存缓存效应和其他任何因素 - 使用经验测量和分析作为基础,而不是抽象数学。
标签: c++ sorting complexity-theory c++-standard-library