80分,一直wa第二个点求助 !

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

Patty_Q @ 2023-01-07 17:45:50

#include <bits/stdc++.h>

using namespace std;

const int N = 5000100;

int n, k, a[N];

void quicksort(int l, int r, int k)
{

    if(l >= r) return;
    swap(a[l], a[l + rand() % (r - l + 1)]);
    int x = a[l];//取值
    int i = l, j = r;//取i,j指针
    while(i < j)//只要i和j没有相遇
    {
        while(i < j && a[j] > x) j--;//j从右往做找小于等于x的数
        if(i < j) a[i++] = a[j];
        while(i < j && a[i] < x) i++;//i从左往右找大于等于x的数
        if(i < j) a[j--] = a[i];
    }
    a[i] = x;//最后把x归位
    if(i == k) {
        printf("%d", a[i]);
        return;
    }
    if(k < i) quicksort(l, i - 1, k);//递归右区间
    else if(k > i) quicksort(i + 1, r, k);//递归左区间
}
int main()
{
    scanf("%d%d", &n, &k);
    k++;
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    if(n == 1) cout << a[1];
    else{
        quicksort(1, n, k);
    }

    return 0;
}

by mooktian @ 2023-02-03 21:23:15

while(i < j && a[j] > x) j--;//j从右往做找小于等于x的数
        if(i < j) a[i++] = a[j];
        while(i < j && a[i] < x) i++;//i从左往右找大于等于x的数
        if(i < j) a[j--] = a[i];

你这个写法看得我很迷惑,看不懂。 好像应该是这样的

while(a[i]<flag) i++;
        while(a[j]>flag) j--;
        if(i<=j) {
            tmp=a[i];a[i]=a[j];a[j]=tmp;
            i++;j--;

你这样写能正常交换么?

@GMU_QinYuCheng


by Patty_Q @ 2023-02-05 22:14:09

@mooktian 问题找到了,是遇到区间长度为1的时候,我直接return了。


|