【问题标题】:Hoare Partition Correctness in javajava中的Hoare分区正确性
【发布时间】:2017-06-27 04:22:58
【问题描述】:

我正在努力将 Hoare 分区实现为快速排序。我试图完全理解 hoare 分区,但这本书并没有解释一切。主要是我只是想知道 while TRUE 部分是什么意思?本书摘录如下。如果我将 while 部分放在 java 中,我会使用什么,为什么?

Hoare-Partition(A,p,r)
    x= A[p]
    i = p-1
    j=r+1
    while true
        repeat
            j=j-1
        until A [j] <= x
        repeat
            i = i +1
        until A[i] >= x
        if i < l
           exchange A[i] with A[j]
        else return j

【问题讨论】:

  • while true 可能意味着表示无限循环。 java代码:while(true)
  • 我想这是有道理的,如果是这种情况,让我发布可能需要的其余代码
  • 是的...那里应该有一个break
  • 我从来没有搞过这样的无限循环,也从来没有在这样的伪代码中见过它
  • 看看我的答案中的以下代码是否有效?

标签: java quicksort


【解决方案1】:

为您上面的算法尝试此代码:

int HoarePartition (int a[],int p, int r) 
{
    int x=a[p],i=p-1,j=r+1;
    while (true) 
    {
        while (a[j] <= x) j--; 
        while (a[i] >= x) i++;
        if  (i < j) swap(a[i],a[j]);
        else return j;
    }
}

【讨论】:

  • 此代码不正确,因为逻辑与原始伪代码不符。伪代码repeat ... until (condition) 的语义应该用Java 编写为while (not condition) ...
【解决方案2】:

这是一个有效的翻译:

  public static void quicksort(int[] ar) {
    if (ar == null) return;
    quicksort(ar, 0, ar.length-1);
  }

  private static void quicksort(int[] ar, int lo, int hi) {
    if (lo < hi) {
      int splitPoint = partition(ar, lo, hi);
      quicksort(ar, lo, splitPoint);
      quicksort(ar, splitPoint+1, hi);
    }
  }

  private static int partition(int[] ar, int lo, int hi) {
    int pivot = ar[lo];
    int i = lo-1, j = hi+1;
    while(true) {
      do { i++; } while(ar[i] < pivot);
      do { j--; } while(ar[j] > pivot);
      if (i < j) swap(ar, i, j);
      else return j;
    }
  }

  private static void swap(int[] ar, int i, int j) {
    int tmp = ar[i];
    ar[i] = ar[j];
    ar[j] = tmp;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2016-02-12
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多