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

目录

前言

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

单躺排序逻辑的实现

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


前言

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

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

代码验证:

相关推荐
LaoZhangGong1239 分钟前
STM32的“Unique device ID“能否修改?
c语言·经验分享·stm32·单片机·嵌入式硬件
万兴丶36 分钟前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
维齐洛波奇特利(male)1 小时前
(动态规划 完全背包 **)leetcode279完全平方数
算法·动态规划
程序员东min1 小时前
数据结构:实验题目:单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表。
数据结构
黄雪超2 小时前
深入HBase——核心组件
数据结构·数据库·hbase
项目申报小狂人2 小时前
改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)
开发语言·算法·matlab
让我们一起加油好吗2 小时前
【排序算法】六大比较类排序算法——插入排序、选择排序、冒泡排序、希尔排序、快速排序、归并排序【详解】
c语言·算法·排序算法
夏末秋也凉2 小时前
力扣-贪心-53 最大子数组和
数据结构·算法·leetcode
liruiqiang053 小时前
机器学习 - 投票感知器
人工智能·算法·机器学习
老猿讲编程5 小时前
安全C语言编码规范概述
c语言·开发语言·安全