优选算法——分治(2):快速选择

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日迹》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨不要物化,矮化,弱化,钝化自己,保持锋芒,不要停止学习 这个世界上只有两个人真正在注意着你 八岁的你,和八十岁的你, 他们此刻正在注视着你, 一个希望你 勇敢开始 ,一个希望你 不留遗憾


1.上期参考代码

cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
    
        qsort(nums,0,nums.size()-1);
        return nums;
    }
    void qsort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return;
        int key=(left+right)/2;
        int mid=nums[key];
        int l=left-1,r=right+1,i=left;//初始化三指针
        while(i<r)
        {
            if(nums[i]<mid)swap(nums[++l],nums[i++]);//维护[0,l]
            else if(nums[i]>mid)swap(nums[--r],nums[i]);//维护[r,right]
            else i++;
        }
        qsort(nums,left,l);
        qsort(nums,r,right);
    }
};

2.本期知识点导图

3.本期要讲解的题目是

数组中的第K个最大元素

要点:

  • 时间复杂度不可超过n,普通快排直接out
  • 堆排序也直接out

4.解题

4.思路

目前世界上还不存在能处理任意输入的、时间复杂度严格为 O (N) 的通用排序算法。

所以我们要就题论题,设计算法

上一期我们学了快速排序算法(三路快排),它是他通过数组分块的思想,优化了在有大量重复元素的排序情况,使得此情况下时间复杂度优于普通快排。

总结下来,

4.1三路快排的两个特点:

  • 数组分块
  • 算法性能有针对性

4.2分析现有条件

本题并没有大量的重复元素,貌似没有三路快排的用武之地。

之前dfs剪枝部分学得好的同学,看到这边可能机有点小感觉了,没错

我们就是要利用数组分块的性质来进行剪枝,来达到优化算法的目的。

如图:
在分快的数组中,我们分别计算出a块和b块的长度 ### 要找第k大的元素,可以分成3条路子

当a的长度大于等于k的时候,要找的值一定在区间r,right中。

当k大于a但是小于等于a+b的时候,一定在区间l+1,r-1中,这边直接返回key就得了。(出口)

还有一种情况,只能在c中了。

确定好在哪个区间之后,递归去找就行了。

代码逻辑

思路:利用三路快排数组分块的特点来剪枝

递归逻辑:

  • 子问题是什么:找出本区间的第k大元素
  • 子问题干什么:排序,判断第k大数在哪个区间。(剪枝)
  • 出口:在b中直接返回

5.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~

期待与佬的再次相遇~

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法