如何在Quicksort算法中实现递归?

时间:2018-03-10 11:58:38

标签: java algorithm sorting

我试图在Java中实现quicksort来学习基本算法。我理解算法是如何工作的(并且可以在纸上完成),但我发现很难在代码中编写它。我设法做了一个步骤,我们将所有元素放在小于枢轴的左边,而较大的元素放在右边(参见下面的代码)。但是,我无法弄清楚如何实现算法的递归部分,因此递归地对左侧和右侧进行排序。有什么帮助吗?

public void int(A, p, q){
    if(A.length == 0){ return; }
    int pivot = A[q];
    j = 0; k = 0;
    for(int i = 0; i < A.length; i++){
        if(A[i] <= pivot){
            A[j] = A[i]; j++;
        }
        else{
            A[k] = A[i]; k++;
        }
    }
    A[j] = pivot;
}

1 个答案:

答案 0 :(得分:0)

大免责声明:我没有写这段代码,所以不需要upvotes。但我链接到一个详细解释quicksort的教程。给我一个非常需要的算法刷新!给出的例子有非常好的评论,可能只是帮助你绕过它。

我建议你让它适应你的代码并为它编写som测试以验证它的工作原理

Quicksort是一种快速,递归,非稳定的排序算法,它按照分而治之的原则运作。 Quicksort在最好的情况下将阵列分成几乎两个相同的部分。它包含n个元素,然后第一次运行需要O(n)。对剩余的两个子阵列进行排序需要2 O(n / 2)。这最终表现为O(n log n)。 在最坏的情况下,quicksort在每次迭代中只选择一个元素。所以它是O(n)+ O(n-1)+(On-2).. O(1)等于O(n ^ 2)。*

public class Quicksort  {
private int[] numbers;
private int number;

public void sort(int[] values) {
    // check for empty or null array
    if (values ==null || values.length==0){
        return;
    }
    this.numbers = values;
    number = values.length;
    quicksort(0, number - 1);
}

private void quicksort(int low, int high) {
    int i = low, j = high;
    // Get the pivot element from the middle of the list
    int pivot = numbers[low + (high-low)/2];

    // Divide into two lists
    while (i <= j) {
        // If the current value from the left list is smaller than the pivot
        // element then get the next element from the left list
        while (numbers[i] < pivot) {
            i++;
        }
        // If the current value from the right list is larger than the pivot
        // element then get the next element from the right list
        while (numbers[j] > pivot) {
            j--;
        }

        // If we have found a value in the left list which is larger than
        // the pivot element and if we have found a value in the right list
        // which is smaller than the pivot element then we exchange the
        // values.
        // As we are done we can increase i and j
        if (i <= j) {
            exchange(i, j);
            i++;
            j--;
        }
    }
    // This is the recursion part you had trouble with i guess?
    // Recursion
    if (low < j)
        quicksort(low, j);
    if (i < high)
        quicksort(i, high);
}

private void exchange(int i, int j) {
    int temp = numbers[i];
    numbers[i] = numbers[j];
    numbers[j] = temp;
}
}

Link to tutorial