60分求助!!!

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

Dreams_Knight @ 2023-01-31 10:46:57

#include<bits/stdc++.h>
using namespace std;
int n , a[10000005];
void quick_sort(int l , int r){
    if(l >= r)
        return;
    int mid = a[l] , i = l , j = r;
    while(i < j){
        while(i < j && a[j] >= mid)
            j--;
        while(i < j && a[i] <= mid)
            i++;
        swap(a[i] , a[j]);
    }
    a[l] = a[i];
    a[i] = mid;
    quick_sort(l , i-1);
    quick_sort(i+1 , r);
}
int main(){
    int n , z;
    cin >> n >> z;
    for(int i = 0;i < n;i++){
        cin >> a[i];
    } 
    quick_sort(0 , n-1);
    cout << a[z];
    return 0;
}

by Zwanan @ 2023-01-31 13:25:46

快排也会超时的

可以在每次快排后,把分段的部分优化,只排序需要用的一段

举个例子

取 k = 1

4 2 3 1 5

第一次的两段为:

1 2 3 | 4 5

两个区间(1,3) (4,5)

这个数据特殊(才会左右有序)

这个时候只需要判断 k 所在的区间,对该区间进行排序查找就可以了


|