基础课学习笔记(汇总){:target=”_blank”}
#include <iostream>
using namespace std;
const int N = 100010;
int n, k, a[N];
int quickfind(int l, int r, int k) {
// 前半部分和快排完全相同
if (l >= r) return a[r];
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while (i < j) {
do i++; while (a[i] < x);
do j--; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
// 求出 SL 的长度(分界点 - 左边界 + 1)
int SL = j - l + 1;
// 情况 A
if (k <= SL) return quickfind(l, j, k);
// 情况 B
else return quickfind(j + 1, r, k - SL);
}
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
cout << quickfind(0, n - 1, k) << endl;
return 0;
}
不太懂为啥sl长度是j-l+1
sl和sr中的s是什么的简写啊?sum?
如果拆开细致的了解递归过程感觉好难。
写的好棒!好强呀
情况b为啥需要j + 1,直接j不行吗
由于找的是第 k 个数, 所以不能重复, 如果 j 的话就会有重复, 导致答案错误
牛啊