- #include <iostream>
- #include <cstdlib>
- using namespace std;
- int n;
- int d[10000];
- int find(int L, int R, int k) {
- int x = rand() % (R - L + 1) + L;
- swap(d[L], d[x]);
- int a = L + 1, b = R;
- while (a < b) {
- while (a < b && d[a] < d[L])
- ++a;
- while (a < b && d[b] >= d[L])
- --b;
- swap(d[a], d[b]);
- }
- if (d[a] < d[L])
- ++a;
- if (a - L == k)
- return d[L];
- if (a - L < k)
- return find(a, R, k - (a - L));
- return find(L + 1, a - 1, k);
- }
- int main() {
- int k;
- cin >> n;
- cin >> k;
- for (int i = 0; i < n; ++i)
- cin >> d[i];
- cout << find(0, n - 1, k);
- return 0;
- }
假设输入的 n,k 和 d[i] 都是不超过 10000 的正整数,且 k 不超过 n,并假设 rand() 函数产生的是均匀的随机数。
3)当输入的 d[i] 是严格单调递增序列时,第 17 行的“swap”的平均执行次数是( )