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

快速排序

文章目录

基础快速排序

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

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

  • numslow < pivot, low++ (low不能超过最后一位)
  • numshigh > 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);
		}

	}
};
相关推荐
咸鱼翻身小阿橙1 分钟前
高斯模糊降噪/磨皮算法降噪图像
前端·opencv·算法·webpack·c#
YIN_尹3 分钟前
【Linux系统编程】基础IO第一讲——系统文件IO
android·java·linux·c++
代码中介商7 分钟前
数据结构进阶(五):最短路径——Dijkstra 与 Floyd 算法
数据结构·算法
casual~8 分钟前
【学习记录(2)】
c++·学习
fengxin_rou9 分钟前
LeetCode链表经典五题:从相交到环形,双指针的妙用
算法·leetcode·链表
KaMeidebaby10 分钟前
卡梅德生物技术快报|抗原如何自己检测?FAdV-4 重组抗原制备与 ELISA 体系技术调试指南
前端·人工智能·物联网·算法·百度
却道天凉_好个秋13 分钟前
HEVC(二):如何实现并行处理
人工智能·算法·计算机视觉·hevc·瓦片技术·波前并行处理wpp
wayz1114 分钟前
Momentum:QQE(定量定性估计)技术指标详解
算法·金融·数据分析·量化交易·特征工程
Dontla15 分钟前
聚类找不到簇原因分析(聚类失败)(DBSCAN聚类算法、eps参数、Epsilon参数、最大允许距离)
算法·数据挖掘·聚类
写代码写到手抽筋8 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g