Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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
C++ 为什么非递归方法比递归方法花费更多的时间?_C++_Algorithm_Sorting_Recursion_Quicksort - Fatal编程技术网

C++ 为什么非递归方法比递归方法花费更多的时间?

C++ 为什么非递归方法比递归方法花费更多的时间?,c++,algorithm,sorting,recursion,quicksort,C++,Algorithm,Sorting,Recursion,Quicksort,以快速排序为例,下面列出了递归和非递归方法 我认为这两种方法实际上实现了相同的算法,因为在非递归方法中使用堆栈来模拟递归过程 然而,我用递归方法得到了AC,但在85%的测试用例通过后,非递归方法超过了时间限制 所以,我的非递归方法有问题吗,或者两种方法之间的时间复杂度有差异 谢谢 乍一看,在循环的底部有: ranges.push(pair<int, int>(0, left - 1)); ranges.push(pair<int, int>(left +

以快速排序为例,下面列出了递归和非递归方法

我认为这两种方法实际上实现了相同的算法,因为在非递归方法中使用堆栈来模拟递归过程

然而,我用递归方法得到了AC,但在85%的测试用例通过后,非递归方法超过了时间限制

所以,我的非递归方法有问题吗,或者两种方法之间的时间复杂度有差异

谢谢


乍一看,在循环的底部有:

    ranges.push(pair<int, int>(0, left - 1));
    ranges.push(pair<int, int>(left + 1, r.second));
对我来说应该是这样

    ranges.push(pair<int, int>(r.first, left - 1));
    ranges.push(pair<int, int>(left + 1, r.second));

函数调用被大量使用,因此很可能被编译器很好地优化了。例如,参数可能在寄存器中传递,而不是像显式堆栈中那样存储到内存中。请因此,如果函数引入了未定义的行为,则无法确定是快还是慢。首先修复你的非递归函数,然后重新运行你的结果。那么,你对为什么会这样做的解释是什么呢?@Algirdas Preidžius这是一种快速排序。使用快速排序,可以迭代处理原始数组中越来越小的区域。代码原样意味着所有区域中有一半以零开始。那是错误的,这不是快速排序的工作方式。使用快速排序,您有一个从a到b的区域,然后取一个中点,然后使用a到中点和中点到b。在第二次迭代中,2个区域中的1个区域以0开始。在下一次迭代中,4个区域中的1个区域从0开始。在下一次迭代中,8个区域中的1个区域以0开头。@SeanF您错过了我评论的要点。目前的答案似乎是我更喜欢这种代码,而不是那种代码,没有解释为什么一种代码比另一种更好。从长远来看,这样的答案是没有用的。@Algirdas Preidžius你没有抓住要点。快速排序是一种已建立的算法。这不是偏好的问题,而是他写的代码是对还是错的问题。这不是一段代码更好的情况。这是他的代码不正确的一个例子。我的工作不是向人们解释快速排序,这远远超出了合理期望的答案来解释计算机科学的概念。他的问题是,他想编写快速排序,而他的代码中存在一些错误。我的回答是指出他的代码中的错误,以便快速排序。@SeanF你又一次没有抓住要点;你应该停止把你的话传给别人:1我没有说这是一个偏好的问题。事实上,你对我所说的应该是意味着它是。我已经说过了。2我在哪里说过你应该解释什么是快速排序?我说你应该解释为什么一个代码段可以工作,而不是另一个。即错误在哪里。从长远来看,只使用代码的答案是没有用的。
    ranges.push(pair<int, int>(r.first, left - 1));
    ranges.push(pair<int, int>(left + 1, r.second));