Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么std::sort和partial_sort需要随机访问迭代器? < >我想知道为什么C++标准要求代码STD::Orths应该只使用随机访问迭代器?我不认为这有什么好处,因为两者的复杂性都是N*log(N)。将std::sort限制为随机访问迭代器(RAI),似乎需要为具有相同复杂性的列表编写单独的函数_C++_Sorting_Complexity Theory_C++ Standard Library - Fatal编程技术网

为什么std::sort和partial_sort需要随机访问迭代器? < >我想知道为什么C++标准要求代码STD::Orths应该只使用随机访问迭代器?我不认为这有什么好处,因为两者的复杂性都是N*log(N)。将std::sort限制为随机访问迭代器(RAI),似乎需要为具有相同复杂性的列表编写单独的函数

为什么std::sort和partial_sort需要随机访问迭代器? < >我想知道为什么C++标准要求代码STD::Orths应该只使用随机访问迭代器?我不认为这有什么好处,因为两者的复杂性都是N*log(N)。将std::sort限制为随机访问迭代器(RAI),似乎需要为具有相同复杂性的列表编写单独的函数,c++,sorting,complexity-theory,c++-standard-library,C++,Sorting,Complexity Theory,C++ Standard Library,这同样适用于部分排序,其中列表的非RAI计数器部分截止到今天 这种设计是因为历史上人们使用了quick\u sort的变体来实现std::sort 如果在RAI容器上编写排序算法有好处,那么最好使std::sort更通用,让像std::vector这样的RAI容器提供专门的v.sort?O(N*log(N))复杂性并不意味着容器是按顺序迭代的,也不是只按照扫描顺序对其进行更改。使用顺序迭代器将以O(N)内存成本来存储所有这些迭代器。算法复杂性并不能说明一切。实际上,在C++中(从形式上看)它不说

这同样适用于
部分排序
,其中列表的非RAI计数器部分截止到今天

这种设计是因为历史上人们使用了
quick\u sort
的变体来实现
std::sort


如果在RAI容器上编写排序算法有好处,那么最好使
std::sort
更通用,让像
std::vector
这样的RAI容器提供专门的
v.sort

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

算法复杂性并不能说明一切。实际上,在C++中(从形式上看)它不说任何东西,因为你不能将代码> N< /代码>无限地增长(<代码> SiZeZt不是任意的精确数),因此C++中的每一种排序算法都是(代码)也<代码> O(1)< /C> > 从实用的角度来看,
std::sort
qsort
的孙子,它很可能是作为快速排序的一种变体实现的

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

编程时不知道所处理的是哪种容器的想法基本上是一种幻觉,因此使用两种不同的显式方法对两种不同类型的容器进行有效排序本身并不被认为是坏的


确实令人恼火的是,
std::sort
没有包含列表迭代器的专门化(我不是模板元编程大师,但这似乎很简单)。

你说人们“历史上”使用快速排序来实现std::sort。“你认为他们现在使用什么?”他们不能使用(未修改的)JohnZwinck今天快速排序。C++ 11标准规定<代码> STD::排序< /COD> >代码> O(n log n)< /C>所有情况下,QuasQueX是代码> O(n ^ 2)< /C>最坏情况.@ JordZWiCK:您确信C++中的代码> O(n log n)< /> >与<代码> O(n ^ 2)< /代码>不同吗?请注意,在C++ <代码> N< /Cord>中有一个上界。@ 6502:您的意思是<代码> siZeX MAX < /代码>?按照这种逻辑,所有(暂停的)算法都是O(1)。但这并不是一个非常有用的描述复杂性的方法。@6502原则上你是对的,但我们大多数人都默认只计算渐近行为,直到渐近线从图中跑出并向无穷远的一点为止。显式多项式基本上没有什么不同;系数被加回去,但它们只在某一点上有效。如果你真的在为现实世界的软件构建模型,你会考虑内存缓存效应和其他任何因素——使用经验测量和分析作为基础,而不是抽象数学。“恼人的是,
std::sort
也不包含列表迭代器的专门化”——除了其他因素,这将允许您对
列表
的子范围进行排序,而
列表::排序
不允许直接进行排序。