1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #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()
函数产生的是均匀的随机数,完成下面的判断题和单选题:
0 of 6 Questions completed
Questions:
You have already completed the quiz before. Hence you can not start it again.
Quiz is loading…
You must sign in or sign up to start the quiz.
You must first complete the following:
0 of 6 Questions answered correctly
Your time:
Time has elapsed
You have reached 0 of 0 point(s), (0)
Earned Point(s): 0 of 0, (0)
0 Essay(s) Pending (Possible Point(s): 0)
1、第 9 行的 x 的数值范围是 L+1 到 R,即 [L+1,R]。( )
2、将第 19 行的 d[a]
改为 d[b]
,程序不会发生运行错误。( )
3、当输入的 d[i]是严格单调递增序列时,第 17 行的 swap
平均执行次数是( )。
4、当输入的 d[i]是严格单调递减序列时,第 17 行的 swap
平均执行次数是( )。
5、若输入的 d[i] 为i,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是( )。
6、若输入的 d[i] 都为同一个数,此程序平均的时间复杂度是( )。