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

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

期待与佬的再次相遇~

相关推荐
cpp_25012 小时前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
田梓燊8 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎9 小时前
算法札记——4.27
算法
数据牧羊人的成长笔记9 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理10 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
d111111111d13 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
Jiangxl~14 小时前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构
李伟_Li慢慢14 小时前
wolfram详解山峦算法
前端·算法
counting money15 小时前
prim算法最小生成树(java)
算法
澈20715 小时前
C++面向对象:类与对象核心解析
c++·算法