Оптимизация QuickSort на C++

Всем доброго времени суток! Я хочу написать оптимизированный алгоритм быстрой сортировки для задачи, в которой нужно вывести k-й элемент, если массив будет отсортирован в порядке возрастания. Массив задаётся довольно необычным способом: даны числа A, B, C и даны первые 2 элемента, а остальные предлагается вычислить следующим образом: a[i] = A * a[i - 2] + B * a[i - 1] + C (для i >= 2). Причём массив надо задавать int-овый, значения в элементах могут переполняться - так и надо по условию. Очевидно, что получается неотсортированный массив, поэтому я сортирую массив, при этом рассматриваю только ту часть, где лежит k. В конце концов просто вывожу элемент по этому индексу. Но не проходит по времени... Подскажите, пожалуйста, что я делаю не так?

P.S. в первой строке даны n - размер массива, k - индекс необходимого элемента при нумерации с 1; во второй - A, B, C, a[0], a[1].

P.P.S. Если кто-то может предложить алгоритм с rand(), который точно будет работать быстрее, то, пожалуйста, поделитесь своими идеями!

#include <fstream>

using namespace std;

void QSort(int arr[], int left, int right, int k) {
    int key = arr[(left + right) / 2];
    int i, j;

    do {
        for (i = left; arr[i] < key; i++);

        for (j = right; key < arr[j]; j--);

        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;

            i++;
            j--;
        }
    } while (i <= j);

    if (left <= k && k <= j && left < j)
        QSort(arr, left, j, k);

    if (i <= k && k <= right && i < right)
        QSort(arr, i, right, k);
}

int main() {
    int n, k;
    int A, B, C;

    ifstream in;
    in.open("kth.in");

    in >> n >> k;
    int arr[n];
    in >> A >> B >> C >> arr[0] >> arr[1];

    in.close();

    for (int i = 2; i < n; i++)
        arr[i] = A * arr[i - 2] + B * arr[i - 1] + C;

    QSort(arr, 0, n - 1, k - 1);

    ofstream out;
    out.open("kth.out");

    out << arr[k - 1];

    out.close();
    return 0;
}

Ответы (0 шт):