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