在quicksort应用程序中这些交换代码行的目的是什么?

时间:2015-01-23 06:22:42

标签: java arrays algorithm sorting quicksort

我试图了解quicksort的实现或应用程序来找到第k个最小元素 这是我想要理解的代码

public int quicksort(int a[], int start, int end, int k) {
    if(start < end) {
        int pivot = partition(a, start, end);
        if(pivot == k -1) {
            return pivot;
        } else if(pivot > k - 1){
            return quicksort(a, start, pivot, k);
        } else {
            return quicksort(a, pivot + 1, end, k);
        }
    } else if(start == end) {
        return k==1?start:-1;
    } else {
        return -1;
    }
}
public int partition(int a[], int start, int end) {
    int pivot = start;
    int i = pivot + 1;
    int j = end;
    while(a[i] < a[pivot] && i < end) {
        i ++;
    } 
    while(a[j] > a[pivot] && j >= 0) {
        j --;
    } 
    if(i < j) {
        swap(a, start, end);
    }
    swap(a,j, pivot);
    return pivot;
}
private void swap(int a[], int swap1, int swap2) {
    int temp = a[swap1];
    a[swap1] = a[swap2];
    a[swap2] = temp;
}

我理解为了尝试找到第k个最小元素,你想使用quicksort,因为pivot左边的元素将小于pivot,而pivot的右边元素将大于。因此,如果您尝试找到第4个最小元素,并且数据透视位于索引3,则可以返回它,因为您知道它是第4个最小元素,因为有3个元素比它小。

我无法理解分区方法中的两个交换。

在第一个while循环结束时,索引i将处于一个位置,在该位置,小于枢轴的所有元素都将位于i的左侧。索引j将位于所有大于枢轴的元素将位于j右侧的位置。

此分区内交换代码的用途是什么? 任何人都可以举例说明为什么这些代码是必要的?这些如何相遇?

if(i < j) {
        swap(a, i, j);
}

并且对于这个交换行(也在内部分区),为什么作者交换枢轴和j,而不是枢轴和我?它是随意的吗?

        swap(a,j, pivot);

1 个答案:

答案 0 :(得分:0)

您可以使用以下位置的分区算法:Quick sort partition algorithm

您使用的算法返回错误的数据透视