经典算法

查找第k小元素

利用快速排序中的一个性质,即将主元素放在正确的位置,使得左边的数都比主元素小,右边的数比元素大,这样会产生一个性质:该数后面是不会移动的,即该数落在排序后的正确位置,也就是序列中第k小的数。

用 k 表示位置,如果下标是从1开始的话,那么第4小的元素就是7,也就是说一趟快速排序就确定了k的位置,后面就不需要递归了。

【输入描述】

输入两行。第一行是数组大小 n 和 k,第二是数组元素,用空格分开;

【输出描述】

输出若一行,输出数组中的第 k 小元素。

【输入样例】

8 3
7 13 4 5 8 1 11 9
【输出样例】

5
【参考程序】

// 小牛编程
#include <bits/stdc++.h>
using namespace std;

int arr[10001], k;

// 快速排序
int quickSort(int arr[], int left, int right) {
    if (left < right) {
        int base = arr[left];
        int i = left, j = right;

        while (i < j) {
            while (arr[j] > base)
                j--;
            swap(arr[i], arr[j]);

            while (arr[i] < base)
                i++;
            swap(arr[j], arr[i]);
        }

        // i = j
        arr[i] = base;
        if (k <= j - 1) {
            quickSort(arr, left, j - 1);
        }
        if (i + 1 <= k) {
            quickSort(arr, i + 1, right);
        }
    }
}

int main() {
    int n;
    cin >> n >> k;

    // 输入数组元素
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }

    // 快速排序(升序)
    quickSort(arr, 1, n);

    cout << arr[k] << endl;

    return 0;
}