求解一个令我迷惑的小问题,回复必关

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

shibazhichang18 @ 2024-12-08 15:18:13

这是我看了题解后尝试写的代码,听取WA声一片

#include<bits/stdc++.h>
using namespace std;
const int N = 5e6 + 5;
int a[N] , k;
void qsort(int l , int r)
{
    int mid = l + (r - l) / 2;
    int i = l , j = r;//l和r需要保留
    while(i <= j)
    {
        while(a[j] > a[mid])
            j --;
        while(a[i] < a[mid])
            i ++;
        if(i <= j)
        {
            swap(a[i] , a[j]);
            i ++;
            j --;
        }
    }
    //快排后数组被划分为三块: l<=j<=i<=r
    if(k <= j)
        qsort(l , j);//递归 
    else if(k >= i)
        qsort(i , r);
    else
    {
        printf("%d" , a[j + 1]);
        exit(0);
    }
}
int main()
{
    int n;
    scanf("%d %d" , &n , &k);//注意地址符 
    for(int i = 0;i < n;i ++)
        scanf("%d" , &a[i]);
    qsort(0 , n - 1);
    return 0;
}

然而当我把快排部分修改成这样,就神奇地AC了...

//其他部分都一样,就省略了
    int mid = a[l + (r - l) / 2];
    int i = l , j = r;//l和r需要保留
    while(i <= j)
    {
        while(a[j] > mid)
            j --;
        while(a[i] < mid)
            i ++;

不是,这俩有什么本质上的区别吗??恳请大佬解答!


by 奈芙蓮 @ 2024-12-08 15:29:03

我猜是因为

swap(a[i] , a[j]);

改变了

a[mid]

的值。


by shibazhichang18 @ 2024-12-08 15:58:04

@奈芙蓮 好像确实有可能...非常感谢大佬orz


|