左侧和右侧之间没有预先划分。特别是,6 不是除法。相反,除法是将左指针和右指针彼此靠近直至相遇的结果。结果可能是一侧比另一侧小得多。
你对算法的描述很好。没有任何地方说你必须停在中间元素。只需继续按照给定的方式执行即可。
顺便说一句:在排序过程中,枢轴元素可能会移动。继续与 6 进行比较,即使它已被移动。
Update:
您对算法的描述确实存在一些小问题。一是步骤 3 或步骤 4 需要包含以下元素:equal到枢轴。让我们像这样重写它:
我对快速排序的理解是
- 选择一个枢轴值(在本例中,选择中间元素的值)
- 在极值处初始化左指针和右指针。
- 从左指针开始向右移动,找到第一个大于或等于主元值的元素。
- 同样,从右指针开始向左移动,找到第一个元素,即
小于主元值
- 交换 3 和 4 中的元素。
- 重复3、4、5,直到左指针大于或等于右指针。
- 对左指针左侧和右侧的两个子数组重复整个过程。
pivot value: 6, left pointer at 8, right pointer at 11
8,7,1,2,6,9,10,2,11 left pointer stays at 8, right pointer moves to 2
2,7,1,2,6,9,10,8,11 swapped 2 and 8, left pointer moves to 7, right pointer moves to 2
2,2,1,7,6,9,10,8,11 swapped 2 and 7, left pointer moves to 7, right pointer moves to 1
pointers have now met / crossed, subdivide between 1 and 7 and continue with two subarrays