我的快速排序桌面测试似乎不正确
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。我们这样做直到 i
和 j
交叉(又名“j
在 i
之前”)。在这种情况下,我们将元素 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 索引在枢轴的最后一步移动到一个不好的位置,但你不在乎你是否打破了它,因为你已经完成了它。现在您递归并快速排序枢轴的左侧和右侧——除非没有左侧,因此在这种角落情况下您只能递归到右侧。
我目前正在练习快速排序,到目前为止效果很好。但是我可以找到一个我失败的例子(因为它似乎是一个特例而且我还没有读过它,这就是为什么我做错了......无法解决它)。问题是我认为是因为我选择了最小的元素作为枢轴元素:
9 1 4 2 7 *0* (star mark means pivotelement)
现在我设置 i,j
其中 i
将遍历数组(向右移动)直到它找到一个大于枢轴元素的元素。 j
将遍历数组(向左移动),直到找到一个低于枢轴元素的元素。找到了,我们把元素switch where i
and j
show at。我们这样做直到 i
和 j
交叉(又名“j
在 i
之前”)。在这种情况下,我们将元素 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 索引在枢轴的最后一步移动到一个不好的位置,但你不在乎你是否打破了它,因为你已经完成了它。现在您递归并快速排序枢轴的左侧和右侧——除非没有左侧,因此在这种角落情况下您只能递归到右侧。