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

快速排序

文章目录

基础快速排序

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

	}
};
相关推荐
Felven24 分钟前
A. Everybody Likes Good Arrays!
数据结构·算法
huangyuchi.39 分钟前
【C++11】Lambda表达式
开发语言·c++·笔记·c++11·lambda·lambda表达式·捕捉列表
什么半岛铁盒1 小时前
Linux线程与进程:探秘共享地址空间的并发实现与内
linux·c++
AI_RSER1 小时前
基于 Google Earth Engine 的南京江宁区土地利用分类(K-Means 聚类)
算法·机器学习·分类·kmeans·聚类·遥感·gee
智践行1 小时前
ROS2 Jazzy:创建自定义的消息和服务接口(C++)
c++·操作系统
Small踢倒coffee_氕氘氚2 小时前
是否应该禁止危险运动论文
经验分享·笔记·算法·灌灌灌灌
Maple_land2 小时前
C++初阶——string的模拟实现(上)
c++
今晚打老虎2 小时前
c++弹窗
开发语言·c++
虾球xz2 小时前
游戏引擎学习第240天:将渲染器移至第三层
c++·学习·游戏引擎
京东云开发者3 小时前
行稳、致远 | 技术驱动下的思考感悟
算法