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

目录

前言

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

单躺排序逻辑的实现

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


前言

对于快速排序算法的实现,在前面两章已经学习了两种不同的实现方法
数据结构 --------- 快速排序算法的实现(挖坑法版本)-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);
}

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

代码验证:

相关推荐
罗西的思考1 小时前
[2W字长文] 探秘Transformer系列之(23)--- 长度外推
人工智能·算法
算AI19 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55520 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
似水এ᭄往昔20 小时前
【C语言】文件操作
c语言·开发语言
owde21 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头21 小时前
分享宝藏之List转Markdown
数据结构·list
hyshhhh21 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大21 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西1 天前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
杉之1 天前
选择排序笔记
java·算法·排序算法