为什么std :: sort和partial_sort需要随机访问迭代器?

时间:2014-07-18 04:32:56

标签: c++ sorting complexity-theory c++-standard-library

我想知道为什么c ++标准要求std::sort只应该使用随机访问迭代器?我没有看到这种优势,因为std::sortstd::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吗?

2 个答案:

答案 0 :(得分:4)

O(N*log(N))复杂性并不意味着容器按顺序迭代,也不意味着对容器的更改只按扫描顺序进行。使用顺序迭代器将以O(N)内存成本来存储所有这些迭代器。

答案 1 :(得分:0)

算法复杂性并不能说明一切。实际上在C ++中(从正式的角度来看)它没有​​说什么,因为你不能将N增长到无穷大(size_t不是任意精度数)因此用C ++编写的每种排序算法都是(正式)也O(1)

从实际角度来看,std::sortqsort的孙子,并且最有可能实现为快速排序的变体。

对数组使用合并排序需要一个与数组大小成比例的额外存储(指向下一个元素的链接),而列表的合并排序不需要任何额外空间,因为您可以重用节点中已存在的链接(无论如何它都将通过排序来销毁。)

在不知道你正在处理什么样的容器的情况下进行编程的想法主要是一种错觉,因此有两种不同的显式方法来有效地对两种不同类型的容器进行排序本身并不被认为是错误的。

std::sort也不包含列表迭代器的特殊化(我不是模板元编程大师,但它看起来很简单,这确实令人讨厌)。