Алгоритм быстрого выбора для возврата K-го наименьшего элемента. Проблема с параметрами для рекурсии - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь написать функцию быстрого выбора, используя случайный стержень, который возвращает наименьший 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...