关于本题的几个问题,望解答~

P1923 【深基9.例4】求第 k 小的数

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 谢谢~


|