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

快速排序

文章目录

基础快速排序

快速排序基于分治法,我们选定一个元素为枢轴(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);
		}

	}
};
相关推荐
咖啡里的茶i16 分钟前
视觉显著目标的自适应分割与动态网格生成算法研究
人工智能·算法·目标跟踪
paeamecium31 分钟前
【PAT甲级真题】- String Subtraction (20)
数据结构·c++·算法·pat考试·pat
YL2004042637 分钟前
047从前序与中序遍历序列构造二叉树
算法·leetcode
极梦网络无忧38 分钟前
password_hash
算法·哈希算法
计算机安禾1 小时前
【c++面向对象编程】第25篇:仿函数(函数对象):重载operator()
开发语言·c++·算法
周末也要写八哥2 小时前
在C++中使用预定义宏
开发语言·c++·算法
学会870上岸华师2 小时前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
小小编程路2 小时前
新手快速学 Python 极简速成指南
开发语言·c++·python
小马过河R2 小时前
RAG检索优化策略:系统性四层框架解析
人工智能·python·算法·ai·llm·rag·问答
AI技术控2 小时前
论文解读:AE-TCN-SA——基于自编码器、TCN 与自注意力机制的锂电池内短路诊断方法
人工智能·python·深度学习·算法·机器学习·自然语言处理