🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日迹》 《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.嗟食
如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦 
佬的支持就是我前进的最大动力
~
期待与佬的再次相遇~