Quicksort算法不适用于Java

时间:2014-02-23 11:01:16

标签: java algorithm quicksort

我的书中有一个Quicksort的伪代码,我正在逐步完成。但最终输出并不是我想要的。我把它变成了这段代码:

public class quickSort {

    public int[] quick(int[] A, int p, int r){
        int q;
        if(p<r){
            q = partition(A, p, r);
            //First partition comfirmed to "work"
            quick(A, p, q-1);
            quick(A, q+1, r);
        }
        return A;
    }

    public int partition(int[] A, int p, int r){

        int x = A[r];
        int i = p-1;
        int temp;

        for(int j=p; j<r-1; j++){
            if(A[j]<=x){
                i = i+1;
                temp = A[i];
                A[i] = A[j];
                A[j] = temp;
            }
        }
        temp = A[i+1];
        A[i+1] = A[r];
        A[r] = temp;

        return i+1;
    }

}

我的书说明了如何处理第一个分区。输入:

2 8 7 1 3 5 6 4  

..第一个分区将此“排序”为

2 1 3 4 7 5 6 8  

..而且我已经确认了。所以,如果这项工作,它只是用较小的部分调用自己做同样的事情,为什么它最终给出输出:

2 3 1 4 5 7 8 7  

..而不是排序的东西???

3 个答案:

答案 0 :(得分:3)

错误是只会在[p, r-2]而不是public int partition()处理元素[p, r-1]。 [r-1]可能恰好小于枢轴,但它没有交换并保持原位

答案 1 :(得分:0)

好吧,所以这里是你的答案调整,它的工作原理:

import java.util.Arrays;

public class QuickSort
{
  public QuickSort()
  {
    int array[] = { 2, 8, 7, 1, 3, 5, 6, 4 };
    quickSort(array, 0, array.length - 1);

    System.out.println(Arrays.toString(array));
  }

  void quickSort(int[] array, int p, int r)
  {
    if (p < r)
    {
      int q = partition(array, p, r);
      quickSort(array, p, q - 1);
      quickSort(array, q + 1, r);
    }
  }

  int partition(int array[], int p, int r)
  {
    int x = array[r];
    int i = p - 1;

    for (int j = p; j < r; j++)
    {
      if (array[j] <= x)
      {
        i += 1;

        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
    }

    int temp = array[i + 1];
    array[i + 1] = array[r];
    array[r] = temp;

    return i + 1;
  }

  public static void main(String[] args)
  {
    new QuickSort();
  }
}

但到现在为止,我确定你必须知道出了什么问题。我不得不遵守我的话,这就是为什么我在这里更新我的答案。

答案 2 :(得分:0)

它应该是 for(int j = p; j&lt; = r-1; j ++)

public int partition(int[] A, int p, int r){

int x = A[r];
int i = p-1;
int temp;

for(int j=p; j<=r-1; j++){
    if(A[j]<=x){
        i = i+1;
        temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }       
}
temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;

return i+1;

}