【数据结构与算法】排序算法之快速排序(简)

快速排序

文章目录

基础快速排序

快速排序基于分治法,我们选定一个元素为枢轴(pivot,通常第一轮选择首元素为枢轴),从两端开始比较,设左端为low,右端为high。

在每轮遍历前,我们把枢纽放到当前区间最后一位,然后从倒数第二位置作为右端

  • nums[low] < pivot, low++ (low不能超过最后一位)
  • nums[high] > pivot, high--(high不能小于0)
  • 找到第一个不小于枢纽,和第一个不大于枢纽的值,若两值位置

注意事项:

  • 注意边界问题
  • 每轮枢纽尽量随机选择,可以提高效率(尤其是针对已经有一定序的对象)

练习:215. 数组中的第K个最大元素

cpp 复制代码
class Solution {
public:
	int findKthLargest(vector<int>& nums, int k)
	{
		if (nums.size() == 1)
			return nums[0];
		// 第k位正确的位置
		int target = nums.size() - k;
		int answer = kTh(nums, 0, nums.size() - 1, target);
		return answer;
	}

	int kTh(vector<int>& nums, int low, int high, int target)
	{
		// 代表只有一个了
		if (low == high) {
			return nums[low];
		}
		int pivot = nums[low], l = low - 1, r = high;
		// 把枢纽存储到最后一个位置去
		std::swap(nums[low], nums[high]);
		while (l < r) {
			do l++;
			while (l < high && nums[l] < pivot);

			do r--;
			while (r >= 0 && nums[r] > pivot);
			if (l < r)
				std::swap(nums[l], nums[r]);
		}
		std::swap(nums[l], nums[high]);
		if (l == target)
			return nums[l];
		else if (l > target) {
			return kTh(nums, low, l - 1, target);
		}
		else {
			return kTh(nums, l + 1, high, target);
		}

	}
};

 {
			return kTh(nums, l + 1, high, target);
		}

	}
};
相关推荐
CoderYanger33 分钟前
A.每日一题——2536. 子矩阵元素加 1
java·线性代数·算法·leetcode·矩阵
普通网友43 分钟前
C++与Qt图形开发
开发语言·c++·算法
KG_LLM图谱增强大模型1 小时前
Vgent:基于图的多模态检索推理增强生成框架GraphRAG,突破长视频理解瓶颈
大数据·人工智能·算法·大模型·知识图谱·多模态
AA陈超1 小时前
UE5笔记:GetWorld()->SpawnActorDeferred()
c++·笔记·学习·ue5·虚幻引擎
普通网友1 小时前
C++中的适配器模式
开发语言·c++·算法
无敌最俊朗@2 小时前
力扣hot100-160-相交链表
c++
普通网友2 小时前
C++中的委托构造函数
开发语言·c++·算法
普通网友2 小时前
C++中的代理模式实战
开发语言·c++·算法
普通网友2 小时前
C++模块化设计原则
开发语言·c++·算法
864记忆2 小时前
Qt c++的基础语法有哪些?
开发语言·c++·qt