数据结构 ——— 快速排序算法的实现(前后指针法版本)

目录

前言

快速排序算法(前后指针法版本)的思想​编辑

单躺排序逻辑的实现

快速排序算法的实现(前后指针法)


前言

对于快速排序算法的实现,在前面两章已经学习了两种不同的实现方法
数据结构 --------- 快速排序算法的实现(挖坑法版本)-CSDN博客
数据结构 --------- 快速排序算法的实现(hoare版本)-CSDN博客

接下来再学习一种办法,能更加理解快速排序的实现,以及此办法能规避更多的缺陷


快速排序算法(前后指针法版本)的思想

初始时,prev 指针指向序列开头,cur 指针指向 prev 指针的后一个位置

然后判断 cur 指针指向的数据是否小于 key ,若小于,则 prev 指针先向后移一位,然后 cur 指向的内容与 prev 指向的内容交换,然后 cur 指针 ++

直到 cur 指针指向的内容大于或等于 key 时就越过,也就是 cur 指针直接 ++

最后 cur 指针 大于数组长度时,prev 指针指向的数据与 key 交换

这样同样能保证 key 左边的比 key 小,bey 右边的比 key 大


单躺排序逻辑的实现

复制代码
int PartSort_Pointer(int* a, int left, int right)
{
	int prev = left;
	int cur = prev + 1;
	int keyi = left;

	while (cur <= right)
	{
		if (a[cur] < a[keyi] && ++prev != cur)
		{
			Swap(&a[prev], &a[cur]);
		}

		cur++;
	}

	// 把 key 放在最终位置
	Swap(&a[prev], &a[keyi]);

	return prev;
}

因为最开始 cur 指针在 prev 的后一个位置

所以当最开始 cur 就遇到比 key 小的值时,prev 指针 ++ 的话,就和 cur 指针重叠了,这样再交换的话就没有意义了,所以在交换的时候需要判断两个指针是否相等

最后再把 key 放在最终位置即可


快速排序算法的实现(前后指针法)

复制代码
void QuickSort(int* a, int begin, int end)
{
	// 前后指针法
	if (begin >= end)	
	{
		return;
	}

	int key = PartSort_Pointer(a, begin, end);

	// [begin,key-1] key [key+1,end]

	QuickSort(a, begin, key - 1);
	QuickSort(a, key + 1, end);
}

和前两章的递归思路一样,这里就不过多赘述

代码验证:

相关推荐
kisshyshy4 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷11 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络13 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络13 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao40013 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao40013 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色