【问题标题】:Quick sort Hoare array partitioning快速排序 Hoare 数组分区
【发布时间】:2018-05-27 06:43:44
【问题描述】:

试图弄清楚为什么 Hoare 分区算法总是将一个数组分成两个正确的部分。在下面的代码中,我扩展了 Hoare algorithm 以使我更清楚(请参阅 cmets 了解详细信息)

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;
}

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

if (leftIndex - 1 > rightIndex) 
  System.out.println("leftIndex - 1 > rightIndex");?

【问题讨论】:

    标签: java algorithm quicksort partition


    【解决方案1】:

    要执行该操作,leftIndex 必须至少为 rightIndex + 2,而这不可能发生,假设我们以 leftIndex 启动函数

    使用这两个循环:

    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 的差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2015-10-28
      相关资源
      最近更新 更多