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
Algorithm QuickSort Dijkstra 3路分区:为什么要进行额外的交换?_Algorithm_Sorting_Quicksort - Fatal编程技术网

Algorithm QuickSort Dijkstra 3路分区:为什么要进行额外的交换?

Algorithm QuickSort Dijkstra 3路分区:为什么要进行额外的交换?,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,给出这里的算法,看看我在“X”的场景,会发生以下情况: 场景:i->“X”,“X”>“p” 算法是否需要过度交换?它是否以某种方式提高了性能? 如果它确实提高了性能,那么如何提高性能 如果它不影响性能,请给出适当的解释或证明,说明为什么它不影响性能 另外,我提到的第二种方法会以任何方式影响性能吗?请解释原因 注:上面使用的“影响性能”表示提高/降低性能。你是对的,额外的交换操作不是必需的,这里的算法最好是为了清晰,但不是为了性能。参见对的讨论 在Robert Sedgewich自己的文章中,他有

给出这里的算法,看看我在“X”的场景,会发生以下情况:

场景:i->“X”,“X”>“p”

算法是否需要过度交换?它是否以某种方式提高了性能? 如果它确实提高了性能,那么如何提高性能

如果它不影响性能,请给出适当的解释或证明,说明为什么它不影响性能

另外,我提到的第二种方法会以任何方式影响性能吗?请解释原因


注:上面使用的“影响性能”表示提高/降低性能。

你是对的,额外的交换操作不是必需的,这里的算法最好是为了清晰,但不是为了性能。参见对的讨论

在Robert Sedgewich自己的文章中,他有一种不同的方法,使用更少的交换操作,但是你可以想象它也需要更多的代码,并且比演示中的算法更不清晰


该算法基于Dijkstra对“荷兰国旗问题”的解决方案,该解决方案出现在1976年出版的《编程规程》一书中(第111页)。Dijkstra在这本书中的目标是推导出多个问题的可证明的正确解决方案。不只是展示最终结果,而是实际完成设计过程

在《荷兰国旗的问题》一书中,迪克斯特拉设想了一排桶(想想数组),每个桶里都有一块颜色为红色、白色或蓝色(荷兰国旗的颜色)的鹅卵石。有一台只有两种操作的微型计算机。它可以交换两个桶里的东西,还可以检查桶里鹅卵石的颜色。他将后一种操作的使用限制为对每个铲斗进行一次检查。后者就足够了,因此这就是他通常优雅的简约风格所选择的。在证明正确性的情况下尽可能少地考虑是绝对有利的。这里引用了他的一篇文章:“……当一个人发现自己面临一个必须区分大量案例的案例分析时,就会变得非常可疑”

转化为排序问题,等价物将是最多有N个比较。这其实很普遍。在C++标准中,不同排序算法和堆操作的复杂性是根据比较的数量。而不是互换的数量。这种想法是,交换是便宜的,如果不使用间接(指针)使其便宜的话。然而,比较可能是昂贵的。因此,从比较次数的角度来说明复杂性更有意义

是的,您可以减少掉期的数量,但如果您希望最多进行N次比较,则不能这样做

1. swap("X", "Z"), gt--;   // the value at i is now "Z", which is still > "P"
2. swap("Z", "Y"), gt--;   // the value at i is now "Y", which is still > "P"
3. swap("Y", "C"), gt--;    // Now we finally get a value at i "C" which is < "P"
// Now we can swap values at i and lt, and increrement them
4. swap("P", "C"), i++, lt++;
1. gt--
2. gt--
3. swap("X", "C"), gt--;   
// Now we can swap values at i and lt, and increrement them
4. swap("P", "C"), i++, lt++;