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

快速排序

文章目录

基础快速排序

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

	}
};
相关推荐
唐墨1231 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏1 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆6 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
老歌老听老掉牙6 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
笑容掩饰我的失落6 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black7 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_967979129 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔9 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆10 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了202610 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法