分区 Java

Partition in Java

我目前正在复习讲师提供的关于围绕轴心点对数组进行分区的一些讲义。

我们讲师给出的伪代码解决方案似乎有意义,直到最后的if语句。

不应该反过来,也就是if(R <= L)吗?

void partition(int L0, int R0, String p)
{
    L = L0;
    R = R0;

    while ( L <= R )
    {
        // left scan
        while ( lt(arr[L], p) )
            L = L + 1;

        // right_scan
        while ( lt(p, arr[R]) )
            R = R-1;

        if ( L <= R )
        {
            exchange(L,R);
            L = L + 1;
            R = R-1;
        }

    }

} // partition

有人可以向我解释为什么会这样吗?

我相信代码是正确的(仅供检查)。这是我的解释尝试:

算法从数组的末端开始,重复扫描和可能的交换,直到索引在中间相遇。左侧扫描跳过左侧所有小于您的枢轴值的项目。右侧扫描会跳过右侧所有大于您的枢轴值的项目。一旦你完成了两次扫描,你就会 L 索引一个大于主元的项目, R 索引一个小于主元的项目。那时你可以交换两个项目 除非 L 已经大于 R(即它们已经相互交叉)。在这种情况下,它们的顺序已经正确,不需要交换。在外循环的下一次测试中,该方法将完成。

我唯一要注意的是,我认为测试可能是 L < R,因为当它们是相同的索引时,进行交换没有太多意义。但如果我遗漏了什么,我很高兴在评论中得到纠正。