请大家帮我看看哪里有问题,两个AC,三个WA

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

Eleven_ZD @ 2024-03-10 23:25:13

//代码操作逻辑:选取输入序列中间数作为基准量,从两边向中间遍历

#include<bits/stdc++.h>

using namespace std;

void find_k(vector<int>& arr, int l, int r, int k)
{
    if (l >= r) return;

    int mid = arr[(l + r) / 2];
    int m = (l + r) / 2;//中间值下标 
    int i = l;
    int j = r;

    while (i < j)
    {
        //从右边开始遍历 
        while (i < j && arr[j] >= mid) j--;
        if (arr[j] < mid)
        {
            swap(arr[j], arr[m]);
            m = j;
            j--;
        }

        // 从左边开始遍历
        while (i < j && arr[i] <= mid) i++;
        if (arr[i] > mid)
        {
            swap(arr[i], arr[m]);
            m = i;
            i++;
        }

    }

    if (k < m) find_k(arr, l, m - 1, k);        //k在左子序列 
    else if (k > m) find_k(arr, m + 1, r, k);   //k在右子序列
    else return;
}

int main ()
{
    int n,k;

    scanf("%d%d",&n,&k);

    vector<int> arr(n);

    for(int i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }

    find_k(arr,0,n-1,k);

    printf("%d",arr[k]);

    return 0;
}

|