尝试手动使用快速选择

时间:2019-05-29 06:17:43

标签: quickselect

我有一个{8,9,7}的子数组。假设选择的枢轴为8。在此阵列上运行Quickselect给我一些问题。 因此,左指针从左开始寻找大于8的元素,找到9。右指针从右寻找小于8的元素,它找到7。7和9交换位置。 {8,7,9}现在,左指针再次找到9,右指针找到7。但是现在它们已经彼此交叉,所以我们不执行该交换。而是将左指针与枢轴交换,从而创建数组{9,7,8},但这不好,因为较小的元素现在不在枢轴的左侧。那我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是很晚了,所以毫无疑问,您已经知道了,但是为了后代:

上面的描述的第一部分与QuickSelect(或QuickSort)中的第一个分区步骤匹配,以零索引(此处的值为8)作为枢轴。

{8,7,9}的变体是正确的-{8,7}{9}的两个部分满足枢轴值8的划分标准。然后,如果进行排序,则对它们进行递归处理以完成排序。当然,如果(快速)选择,则只处理要查找的索引所在的部分。

left pointer is swapped with the pivot步骤在这里不适用。仅当您使用变体将枢轴移到前面或后面(如果尚不存在)然后从分区过程中排除枢轴索引时,才应该这样做。只有这样做了,才需要将枢轴值移动到两个分区相交的位置。