我有一个子数组是{8,9,7}。假设选取的枢轴为 8。在此阵列上运行快速选择给我带来了一些问题。因此,左指针从左侧开始寻找大于 8 的元素,它找到 9。右指针从右边开始寻找小于 8 的元素,它找到 7。7 和 9 交换位置。{8,7,9} 现在,左指针再次找到 9,右指针找到 7。但是现在它们已经相互交叉,所以我们不执行这种交换。相反,左指针与创建数组 {9,7,8} 的枢轴交换,但这并不好,因为较小的元素现在不在枢轴的左侧。那我做错了什么?
这是很久以后的事情了,所以你无疑已经想通了,但对于后代来说:
上述描述的第一部分与使用零索引(此处值为 8(作为透视的快速选择(或快速排序(中的第一个分区步骤匹配。
{8,7,9}
变化是正确的 - {8,7}
和{9}
两个部分满足枢轴值 8
的分区标准。然后递归处理这些以完成排序(如果排序(。当然,如果您(快速(选择,则仅处理要查找的索引所在的部分。
left pointer is swapped with the pivot
步骤不适用于此处。仅当使用将数据透视表移动到前面或后面的变体(如果尚未存在(然后从分区过程中排除透视索引时,才应执行此操作。只有这样做,才需要将透视值移动到两个分区相遇的位置。