Input:输入包含n个元素的序列,k
Output:第k小的元素
- #include <iostream>
- #include <algorithm>
- using namespace std;
- //快速选择算法
- int n, k, a[100001];
-
- //k:第k个元素的绝对位置
- int quick_select(int l, int r, int k) {
- if (l < r) {
- int i = l, j = r, x = a[(l + r) / 2];
- while (i <= j) {
- while (a[i] < x)
- i++;
- while (a[j] > x)
- j--;
- if (i <= j) {
- swap(a[i], a[j]);
- i++; j--;
- }
- }
- //特判i+2==j并且k恰好在j+1的位置的情况
- if (j + 2 == i && k == j + 1) {
- return a[k];
- }
- if (k <= j) {
- return quick_select(l, j, k);
- }
- else {
- return quick_select(i, r, k);
- }
-
- }
- return a[l];
- }
-
- int main()
- {
- cin >> n >> k;
- for (int i = 1; i <= n; i++) {
- cin >> a[i];
- }
- cout << quick_select(1, n, k);
- return 0;
- }