优选算法——分治(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.嗟食

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

期待与佬的再次相遇~

相关推荐
Z...........2 小时前
(优选算法)斐波那契数列模型
数据结构·算法
zyjyyds1132 小时前
和为0的四元组-双指针法(C语言实现)
c语言·数据结构·算法
炽烈小老头2 小时前
【每天学习一点算法 2026/03/16】电话号码的字母组合
学习·算法
Lee川2 小时前
时空迷宫探险记:从O(1)到O(2^n)的算法进化论
算法·面试
KangJX2 小时前
Matrix获取卡顿堆栈 (Point Stack)
算法·客户端
靠沿2 小时前
【优选算法】专题十三——队列+宽搜(BFS)
算法·宽度优先
ccLianLian3 小时前
算法·字符串哈希
算法·哈希算法
SongYuLong的博客3 小时前
Linux IPC进程通信几种方法
linux·运维·算法
像污秽一样3 小时前
算法设计与分析-习题6.1
数据结构·算法