6.详解快速排序--非递归版本

快速排序是一种由C.A.R.Hoare在1960年提出的高效排序算法,平均时间复杂度为O(nlogn),优于O(n^2)的冒泡排序和选择排序。非递归版本主要用于防止深度递归可能导致的栈溢出,其基本思想是使用堆栈模拟递归过程。在非递归版本中,通过调整入栈顺序确保正确执行。
摘要由CSDN通过智能技术生成

快速排序前言

前言:快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一种改进。快速排序就跟它的名字一样,效率很快。跟冒泡排序,选择排序相比,它们使用相同的空间大小,但是,快速排序却可以达到O(nlogn)的时间复杂度,比O(n^2)要快上很多。快速排序是一个非常高效的排序方法,很多编译器里的排序方法都是选择的快速排序(比如vs编译器)。
.
.
.
.

快速排序的特点

时间复杂度:O(N*logN)
空间复杂度:O(logN)
稳定性:不稳定

稳定性:相同的数据在排序的过程中这些数据的相对位置是否会变化,不变化则稳定
.
.
.
.

快速排序非递归版

问:为什么会有非递归版本呢,非递归版本和递归版本的区别是什么

理论上:每调用一个函数就会在栈帧中开辟空间,当递归的深度很深时,就可能会栈溢出,导致程序崩溃,所以衍生出非递归的版本。
实际上:因为快速排序的效率非常高,一般不会出现栈溢出。

非递归版本是主要是利用堆的空间

非递归版本和递归版本的效率没多大区别

在这里插入图片描述

快速排序非递归版本就是模仿上面这张图的处理顺序

方法:

第一步:
在这里插入图片描述
问:为什么先right入栈,再div + 1入栈…这样的顺序入栈?

根据栈的先入先出规则,left是最后一个入这样才能保证left先出

第二步:
在这里插入图片描述
gif配图:
在这里插入图片描述

参考代码如下:

void QuickSortNoR(int* a, int n)
{
	stack<int> st;
	int left = 0, right = n - 1;

	int div = PartSort1(a, left, right);
	if(right > div + 1)
	{
		st.push(right);
		st.push(div + 1);
	}
	if (left < div - 1)
	{
		st.push(div - 1);
		st.push(left);
	}
	while (!st.empty())
	{
		left = st.top();
		st.pop();
		right = st.top();
		st.pop();

		div = PartSort1(a, left, right);
		if (right > div + 1)
		{
			st.push(right);
			st.push(div + 1);
		}
		if (left < div - 1)
		{
			st.push(div - 1);
			st.push(left);
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值