排序算法(六):快速排序的递归与非递归实现

快速排序思想:
在数据中找一个基准数据,将数据按照基准数据分成两部分,前一段比基准小后一段比基准大,按照同样的思路分别处理前一段和后一段数据直到数据有序。

递归实现:
时间复杂度 : O(nlog(n))
空间复杂度 : O(log(n))
稳定性 : 不稳定

int OneQuick(int* arr, int* start,int* end)
{
	int tmp = *start;
	while (start < end)
	{
		while (start < end && *end > tmp) end--;
		*start = *end;

		while (start < end && *start < tmp) start++;
		*end = *start;
	}
	*start = tmp;
	return start - arr;
}

void Quick(int* arr, int* start, int* end)
{
	if (end <= start) return;

	int mid = OneQuick(arr, start, end);
	Quick(arr, start,arr + mid - 1);
	Quick(arr, arr + mid + 1, end);

}

void QuickSort(int* arr, int len)
{
	Quick(arr,arr,arr + len - 1);
}

排序结果:
在这里插入图片描述

非递归实现:
将排序元素起始和终止位置存入栈中,进行排序得到基准,先将基准右边起始和终止位置元素入栈,再将左边起始和终止位置入栈,重复至栈空。

时间复杂度 : O(nlog(n))
空间复杂度 : O(log(n)) (根据栈使用空间决定)
稳定性 : 不稳定

引用其他项目建立的栈,包含其路径并将其项目生成文件设为静态库

#include "../栈/stack.h"
#include "../栈/stack.cpp"

void Quick2(int* arr, int* start, int* end)
{
	stack st;
	Initstack(&st);

	ElemType val = { start,end };
	Pushstack(&st,val);

	while (!Emptystack(&st))
	{
		ElemType date;
		date = Topstack(&st);
		Popstack(&st);

		int mid = OneQuick(arr, date.start, date.end);
		if (arr + mid - date.start > 1)
		{
			val.start = date.start;
			val.end = arr + mid - 1;
			Pushstack(&st,val);
		}
		if (date.end - (arr + mid) > 1)
		{
			val.start = arr + mid + 1;
			val.end = date.end;
			Pushstack(&st,val);
		}
	}
	Destroystack(&st);
}

排序结果:
在这里插入图片描述
或者使用c++提供的栈

typedef struct
{
	int* start;
	int* end;
}ElemType;

void Quick3(int* arr, int* start, int* end)
{
	stack<ElemType> st;
	
	ElemType val = { start,end };
	st.push(val);

	while (!st.empty())
	{
		ElemType date;
		date = st.top();
		st.pop();

		int mid = OneQuick(arr, date.start, date.end);
		if (arr + mid - date.start > 1)
		{
			val.start = date.start;
			val.end = arr + mid -1;
			st.push(val);
		}
		if (date.end - (arr + mid) > 1)
		{
			val.start = arr + mid + 1;
			val.end = date.end;
			st.push(val);
		}
	}
}

排序结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值