zoukankan      html  css  js  c++  java
  • 快速选择算法

    快速选择算法

    快速选择算法基于快速排序算法,时间复杂度由(O(nlogn))降到(O(n))

    思想是这样的,快速选择不需要所有的数据,只需要知道这个数排在第几位

    而快速排序算法刚好可以满足这个要求,因为快速选择算法每次都将整个区间一分为二,每次对比可以知道要求的数在哪个区间,然后选择对应的区间进行递归即可。

    时间复杂度之所以降低,就是因为快速选择算法不需要递归两边。

    #include <iostream>
    using namespace std;
    const int maxn = 1e5 + 10;
    int q[maxn], n, m;
    
    int solve(int l, int r, int k)
    {
        if (l == r)
            return q[l];//保证了k一直在[l,r]中,区间里只有一个数的时候说明找到了答案
        int tmp = q[l + r >> 1];
        int i = l - 1, j = r + 1;
        while (i < j) {
            while (q[++i] < tmp);
            while (q[--j] > tmp);
            if (i < j)
                swap(q[i], q[j]);
        }
        int sl = j - l + 1;//求出区间的长度,之所以用j,是因为这个是由下面如何递归决定的。递归的是solve(l,j,k),说明区间长度就是j-l+1。如果换成i,就必须用递归区间为i的方式
        if (k <= sl)
            return solve(l, j, k);
        else
            return solve(j + 1, r, k - sl);
    }
    
    int main()
    {
        cin >> n >> m;
        for (int i = 0; i < n; i++)
            cin >> q[i];
        cout << solve(0, n - 1, m);
        return 0;
    }
    
  • 相关阅读:
    《代码整洁之道》读书笔记六
    第九周总结
    《构建之法》读后感(五)
    学习进度条-第十二周
    3. 统计数字
    《构建之法》读后感(四)
    学习进度条-第十一周
    4. 丑数 II
    《构建之法》读后感(三)
    学习进度条-第十周
  • 原文地址:https://www.cnblogs.com/Salty-Fish/p/13516609.html
Copyright © 2011-2022 走看看