为啥前两个测试点过不去

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

Gongxi12 @ 2023-12-17 13:05:37

#include<iostream>
using namespace std;
long long a[5000010];
int w;
void qs(int l, int r) {
    int i = l, j = r;
    long long k = a[(l + r) / 2];
    while (i < j) {
        while (a[i] < k) {
            i++;
        }
        while (a[j] > k) {
            j--;
        }
        swap(a[i], a[j]);
    }
    if (w < i) {
        qs(l, i - 1);
    }
    else if (w > i) {
        qs(i + 1, r);
    }
    else if (w == i) {
        return;
    }
}
int main() {
    int n;
    scanf("%d %d", &n, &w);
    for (int i = 0; i < n; i++) {
        scanf("%lld", &a[i]);
    }
    qs(0, n - 1);
    printf("%lld", a[w]);
}

by Igunareo @ 2023-12-21 21:31:41

@Gongxi12

swap(a[i], a[j]);前要加if(i<=j),判断完得更新i,j

还有,用do while吧


by sulingfeng @ 2024-01-16 18:49:51

直接sort不行吗


|