Я пытаюсь написать функцию быстрого выбора, используя случайный стержень, который возвращает наименьший K-й элемент, но я не могу определить правильные параметры для рекурсии. Я считаю, что первая часть функции работает отлично, так как я адаптировался из функции быстрой сортировки, только рекурсивные вызовы, которые я не могу понять правильно.
int quickselect(int* A, int k, int n) {
int i, left_part, right_part, pivot, temp;
if (n > 1)
{
//Choosing a random pivot and putting it at the end of the array
i = rand() % n;
pivot = A[i];
A[i] = A[n - 1];
A[n - 1] = pivot;
left_part = 0; right_part = n - 1;
// While loop is responsible for the comparison of the elements
while (left_part < right_part)
{
for (; A[left_part] < pivot; left_part++)
;
for (; A[right_part] >= pivot && right_part > left_part; right_part--)
;
if (left_part != right_part)
{
temp = A[left_part];
A[left_part] = A[right_part];
A[right_part] = temp;
}
}
// Making sure pivot is in correct position
A[n - 1] = A[left_part];
A[left_part] = pivot;
if (i == k) {
return A[k];
}
else if (i > k) {
// Element is to the left of pivot
return quickselect(A, k, left_part);
}
else if (i < k) {
// Element is to the right of pivot
return quickselect(A + left_part + 1, k - left_part, n - left_part - 1);
}
}
}