不是到底哪错了,样例没错,全WA,今晚睡不着觉了

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

Hauauah @ 2024-01-22 01:59:38

#include<bits/stdc++.h>
using namespace std;
int arr[5000005],k;
void quicksort(int left,int right){
    int i = left;int j = right;int base = (i+j)/2;
    int tem;
    while(i<=j){
        while(arr[i]<arr[base]) i++;
        while(arr[j]>arr[base]) j--;
        if(i<=j){
            swap(arr[i],arr[j]);
            i++;
            j--;
        }
    }
    if(k<=j) quicksort(left,j);
    else if(k>=i) quicksort(i,right);
    else {
        cout<<arr[j+1];
        exit(0);
    }
}

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

by 帝都_henry26268 @ 2024-01-22 08:17:17

@Hauauah

额,我大概找到你的bug了

对于快排来说,是选定一个数作为中间点Mid,左右点依据Mid分成 L,Mid 和 Mid,R

按照这一个固定数进行二分,

但在你的代码中这个固定数在一定过程后可能被swap跳掉了导致这个数不为固定

具体的

void quicksort(int left,int right){
    int i = left,j = right;
    int Mid = arr[(left+right)>>1];//这里改了

    while(i<=j){
            //这里应该是Mid
        while(arr[i] < Mid) i++;
        while(arr[j] > Mid) j--;

        if(i<=j){
            swap(arr[i],arr[j]);
            i++;j--;
        }
    }
    if(k<=j) quicksort(left,j);
    else if(k>=i) quicksort(i,right);
    else{
        cout << arr[j+1] << endl;
        return ;
    }
}

by Lightning_ @ 2024-02-28 22:49:35

@帝都_henry26268 测试样例通过的话不应该对一个吗?


by 帝都_henry26268 @ 2024-02-29 07:32:59

@Lightning_ 我没说样例测试通过啊?或者你指的什么意思我没明白。。。


|