这种分区算法是否正确?

时间:2012-07-23 03:39:11

标签: algorithm sorting quicksort

我一直在查看“Cracking the Coding Interview”一书中的分区功能(5e,第119页)。我在下面复制了它:

int partition(int arr[], int left, int right){
    int pivot = arr[(left + right) /2 ]; // Pick pivot point
    while (left <= right) {
        // Find element on left that should be on right
        while (arr[left] < pivot) left++;
        // Find the element on right that should be on left
        while (arr[right] > pivot) right--;
        // Swap elements, and move left and right indicies
        if (left <= right) {
            swap(arr, left, right); // swaps elements
            left++;
            right--;
        }
    }
    return left;
}

鉴于此数组:

1 2 3 4 5 6 3

这就是分区为我分步的方法

  1. 4是枢轴值。 left = 0,right = 6
  2. left = 3,right = 6.交换。

    1 2 3 3 5 6 4

  3. left = 4,right = 4.退出

  4. 然而,阵列我最终得到:

    1 2 3 3 5 6 4
    

    未分区4.我是否错误地执行了步骤或算法是否错误?我已经仔细检查了我对算法的再现,并且我已经正确地复制了它。

    另外,我不赞成为什么分区会向左返回,它是否会返回枢轴?

    我理解维基百科对分区和快速排序的实现,但我试图围绕这里发生的事情。

2 个答案:

答案 0 :(得分:4)

分区的目标是将阵列分成两个部分。第一段包含元素[1,2,3,3]。所有这些值都小于或等于4。第二部分包含元素[5,6,4]。所有这些值都大于或等于四。

分区函数返回第二个段开始的位置。在这种情况下,它从索引4开始。

答案 1 :(得分:0)

分区算法的目标是简单地获取一些元素集合(例如,您使用“数组”),然后围绕枢轴将该集合划分(分为两个部分),即左部分和右部分。

关于枢轴左侧和枢轴右侧的元素,应该有一些“规则”。 例如,左侧的所有元素将小于所选的轴,而右侧的所有元素将大于轴。

您还可以在以下视频中看到实施: describe-log-groups

希望有帮助!