我的快速排序桌面测试似乎不正确

My quicksort desk test doesn't seem to be correct

我目前正在练习快速排序,到目前为止效果很好。但是我可以找到一个我失败的例子(因为它似乎是一个特例而且我还没有读过它,这就是为什么我做错了......无法解决它)。问题是我认为是因为我选择了最小的元素作为枢轴元素:

9 1 4 2 7 *0*  (star mark means pivotelement)

现在我设置 i,j 其中 i 将遍历数组(向右移动)直到它找到一个大于枢轴元素的元素。 j 将遍历数组(向左移动),直到找到一个低于枢轴元素的元素。找到了,我们把元素switch where i and j show at。我们这样做直到 ij 交叉(又名“ji 之前”)。在这种情况下,我们将元素 i 切换到显示并使用 pivoelement 索引 i ...我现在不想描述整个算法,否则这将是一个很长的问题..

9 1 4 2 7 *0*
i       j        but now we cannot find a j that is lower than Pivotelement. What we do?
                 I would continue by switching i with pivotelement:

*0* 1 4 2 7 9
          j i    But now is the Problem that i and j are in other positions
                 (j is before i). I have no idea.. Please clarify and help.. 

QuickSort 使用分区的概念。在每次迭代中,它都会拾取一个 pivot 元素并尝试将其放置在最终放置的位置。

一开始 i 指针总是保持在索引 -1(这显然是不可能的,所以我们只给 i 赋值 -1 并且在我们递增它之后只引用一个数组元素)。

所以在你的场景中,在你得到的第一次迭代之后,

0 1 4 2 7 9

这是所选枢轴元素的正确位置。

解释: 因为 i 最初是 -1,所以你递减 j 指针直到你得到一个小于当前主元的元素(0).这将 j 一直带到索引 0(您需要将这些条件添加到代码中以确保没有非法内存 space 被访问)。

最后 i+1(其中 i 仍然是 -1)被替换为枢轴元素,因此有效地 9 被替换为 0 和中提琴!

参考this link以获得更全面的解释。

你所拥有的很好,你已经成功地旋转了。

枢轴位置正确,枢轴两边都满足左边所有元素都小于右边所有元素都更大的条件。 i 索引在枢轴的最后一步移动到一个不好的位置,但你不在乎你是否打破了它,因为你已经完成了它。现在您递归并快速排序枢轴的左侧和右侧——除非没有左侧,因此在这种角落情况下您只能递归到右侧。