#include<bits/stdc++.h>
using namespace std;
int sum;
int a[2001];
int select(int l, int r, int k) {
sum++;
int m = a[(l + r) / 2], t;
int i = l, j = r;
while (i <= j) {
while (a[i] > m) i++;
while (a[j] < m) j--;
if (i <= j) {
t = a[i]; a[i] = a[j]; a[j] = t;
i++; j--;
}
}
if (k <= j) return select(l, j, k);
if (k >= i) return select(i, r, k);
return a[k];
}
int main() {
int n, k;
cin >> n >> k;
sum = 0;
for (int i = 1; i <= n; i++) cin >> a[i];
cout << select(1, n, k) << " ";
cout << sum << endl;
return 0;
3) 输入 1: 10 3 6 2 1 8 7 9 4 5 10 3 输出 1: (D)
A. 33 B. 34 C. 83 D. 84
4) 输入 2: 1000 13 12 34.. 998 999 1000 输出 2: (C)
A. 1310 B. 1311 C. 988 D. 98810
解析(没有理解交换的步骤是如何进行的):
以下是从图中提取的文字:
数据范围不大,直接模拟一下就行了。 开始: 62187945103 第一轮 i=1,j=10,结束后: 10978124563 此时 i=5,j=4 第二轮 i=1,j=4,结束后: 10978 此时 i=3,j=1 第三轮 i=3,j=4,结束后: 87 此时 i=4,j=3 第四轮 i=3,j=3,找到答案 8 结束,输出 84。
虽然数据范围很大,但是其实第一轮结束后就全部排好序了。因此只需要考虑 i,r,i,j 的值即可。
第一轮: i=1,r=1000,i=501,j=500
第二轮: i=1,r=500,i=251,j=249
第三轮: i=1,r=249,i=126,j=124
第四轮: i=1,r=124,i=63,j=61
第五轮: i=1,r=61,i=32,j=30
第六轮: i=1,r=30,i=16,j=14
第七轮: i=1,r=14,i=8,j=6
第八轮: i=8,r=14,i=12,j=10
第九轮: i=12,r=14,此时第 k 个位置恰好是中位数,直接输出结果 988 9