exit(0)退出当前所有文件,全部掐掉。
每一次排序后会有 left<=j<=i<=right
其中j和i之间最多只有一个数字,或无数字
前j大的数字在第一段,
后i小的数字在第三段,
中间一段有个单独数字表示 在i 和 j之间小的,有时候会有表示,有时候无。
scanf 比cout省太多时间了。
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int a[5000001];
int i, j;
void quick(int a[], int left, int right) {
int temp;
int i = left, j = right, flag = a[(left + right) / 2];
while (i <= j) {
while (a[i] < flag)
i++;//找到比flag大的数,若小,则循环
while (a[j] > flag)
j--;//找到比flag小的数
if (i <= j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
if (k <= j)
quick(a, left, j);
else if (k >= i)
quick(a, i, right);
else {
printf("%d", a[j + 1]);
exit(0);
}
}
int main() {
cin >> n >> k;
k++;
for (i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
quick(a, 1, n);
cout << a[k];
}