快速排序Hoare阵列分区

时间:2017-12-13 11:30:58

标签: java algorithm quicksort partition

试图弄清楚为什么Hoare分区算法总是将数组分成两个正确的部分。在下面的代码中,我扩展min(X, key=lambda x: x[-1]) 以使我更清楚(请参阅注释以获取详细信息)

Hoare algorithm

所以问题是:是否可以将数组传递给分区函数,所以下面的行会被执行?

int partition(int[] arr, int leftIndex, int rightIndex) {
  int pivot = arr[(leftIndex + rightIndex) / 2];

  while (leftIndex <= rightIndex) {
    while (arr[leftIndex] < pivot) leftIndex++;
    while (arr[rightIndex] > pivot) rightIndex--;

    // If all numbers at right places, than leftIndex and rightIndex 
    // could point at same array element index
    // So it's means partion done. 
    // We should return leftIndex + 1 cause 
    // rightIndex points at the last element of the left sub array

    if (leftIndex == rightIndex) return leftIndex + 1; 

    if (leftIndex < rightIndex) {
      swap(arr, leftIndex, rightIndex);
      leftIndex++;
      rightIndex--;
    }
  }

  //But here the tricky thing: Why does this "if case" never execute?
  if (leftIndex - 1 > rightIndex) 
    System.out.println("leftIndex - 1 > rightIndex");

  return leftIndex;
}

1 个答案:

答案 0 :(得分:2)

要执行它,leftIndex必须至少是rightIndex + 2,并且这是不可能发生的,假设我们用leftIndex&lt; = rightIndex启动函数:

使用这两个循环:

while (arr[leftIndex] < pivot) leftIndex++;
while (arr[rightIndex] > pivot) rightIndex--;

指数永远不会相互交叉 - 如果不是更快,它们将停在枢轴的任何一侧。

如果是这种情况,我们将离开该函数:

if (leftIndex == rightIndex) return leftIndex + 1; 

所以,唯一剩下的就是:

if (leftIndex < rightIndex) {
  swap(arr, leftIndex, rightIndex);
  leftIndex++;
  rightIndex--;
}

即使它们尽可能接近(leftIndex == rightIndex - 1),在执行之后它们也会在leftIndex == rightIndex + 1。我们仍然没有得到2的差异。