我试图了解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);