• 线性求第k大


    快排变种.

    快排每次只进行部分排序,进入左边或者右边或者当前mid就是答案.

    据说期望值是O(n)

    然后STL中的 nth_element也是用这个思想.

    #include <cstdio>
    // #include <windows.h>
    
    using namespace std;
    
    const int maxn = 1e6+5;
    
    int arr[maxn];
    int n, k;
    
    int _sort(int l, int r) {
    
        int mid = (l + r) / 2;
        int ll = l, rr = r;
        int val;
        val = arr[mid];
        arr[mid] = arr[l];
        while (l < r) {
            while (arr[r] > val && l < r) r--;
            arr[l] = arr[r];
            while (arr[l] <= val && l < r) l++;
            arr[r] = arr[l];
        }
        arr[l] = val;
        if (l == k) return arr[l];
        if (l - 1 > ll && ll<=k && k<=l-1) return _sort(ll, l-1);
        else if (rr > l + 1 && l+1<=k && k>=rr) return _sort(l+1, rr);
        else if (l-1 == k) return arr[l-1];
        else if (l+1 == k) return arr[l+1];
        else return -1;
    }
    
    int main() {
        //int n;
        scanf("%d%d", &n, &k);
        for (int i=0; i<n; ++i) scanf("%d", &arr[i]);
        k = n - k;
        printf("%d 
    ", _sort(0, n-1));
    //    for(int i=0; i<n; ++i) printf("%d ", arr[i]);
    //    system("pause");
    
        return 0;
    }
  • 相关阅读:
    MyBatis中文文档
    网络编程
    Django
    Django
    Django
    Django
    Django
    Django
    Django
    Django
  • 原文地址:https://www.cnblogs.com/cgjh/p/10350562.html
Copyright © 2020-2023  润新知