Play_CP_4fun @ 2022-04-28 17:44:27
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 5;
int n, k, q[N];
void quick_sort(int a[], int l, int r) {
int i = l - 1, j = r + 1, x = a[(l + r) / 2];
if (l >= r) return;
while (i <= j) {
do i++; while (a[i] < x);
do j--; while (a[j] > x);
if (i <= j) swap(a[i], a[j]);
}
// quick_sort(a, l, j);
// quick_sort(a, j + 1, r);
// for (int i = 0; i < n; i++) {
// cout << a[i] << ' ';
// if (i == n - 1) cout << "\n";
// }
if (k == j) return;
else if (k < j) quick_sort(a, l, j);
else if (k > j) quick_sort(a, j + 1, r);
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> q[i];
quick_sort(q, 0, n - 1);
cout << q[k];
return 0;
}
不知道为什么MLE和WA了。望大佬解答。 平时写快排代码的这几行
quick_sort(a, l, j);
quick_sort(a, j + 1, r);
不能改成
quick_sort(a, l, i);
quick_sort(a, j, r);
是为什么呢,是和我上面的快排写法有关吗? 提前谢谢大家
by _Haoomff_ @ 2022-04-28 17:46:12
@Play_CP_4fun 我觉得应该是那个do-while的问题
by arrow_king @ 2022-04-28 17:50:29
最好改成while(a[i]>x) i++
,因为do-while是先执行后判断,可能会多做一次
by _Haoomff_ @ 2022-04-28 17:58:33
@秦屎皇 对的,我编程老师教的快排使用while的
by Play_CP_4fun @ 2022-04-28 18:07:41
@秦屎皇 好的谢谢~
by Play_CP_4fun @ 2022-04-28 18:08:01
@Haoomff 谢谢~