Какова цель этих строк кода подкачки в приложении быстрой сортировки?
Я пытаюсь понять реализацию или приложение быстрой сортировки, чтобы найти 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-й наименьший элемент, вы хотите использовать быструю сортировку, потому что элементы слева от центра будут меньше, чем элементы, а элементы справа от центра будут больше, чем. Таким образом, если вы пытаетесь найти 4-й наименьший элемент, а пивот находится с индексом 3, вы можете просто вернуть его, потому что знаете, что он 4-й наименьший, так как на 3 элемента меньше его.
У меня проблемы с пониманием двух перестановок в методе раздела.
По завершении первого цикла while индекс i будет находиться в положении, в котором все элементы, меньшие, чем точка поворота, будут слева от i. Индекс j будет в положении, в котором все элементы больше, чем точка поворота, будут справа от j.
Какова цель этого кода подкачки внутри раздела? Кто-нибудь может привести пример, почему этот код необходим? Как они встретятся?
if(i < j) {
swap(a, i, j);
}
А также для этой строки подкачки (также внутри раздела), почему автор поменял pivot и j, а не pivot и i? Это произвольно?
swap(a,j, pivot);