数据结构快速排序非递归实现

Posted Bitdancing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构快速排序非递归实现相关的知识,希望对你有一定的参考价值。

常见的排序算法有以上八种,点击专栏就可以看其他排序算法,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心

OJ链接


快速排序的非递归实现可以使用 队列 和 栈进行。使用 队列 类似于 二叉树的层序遍历;使用 栈 类似于 二叉树的前序遍历。

本文采用栈进行非递归实现。

解题思想

根据栈先入后出的特点,用栈实现快速排序非递归分为以下过程:

  1. 右区间先入栈
  2. 左区间入栈,再取出栈顶
  3. 然后再右区间、左区间依次入栈,出左区间,直到栈为空。

图解过程

在一次单趟排序后,右区间、左区间依次入栈。

栈中数据:

取栈顶元素,进行单趟排序,依次压入右区间和左区间。

依次循环,直到左右区间不满足条件。

程序代码

void QuickSortNonR(int* a, int left, int right)

	// 栈
	ST st;
	StackInit(&st);
	StackPush(&st, left);
	StackPush(&st, right);

	while (!StackEmpty(&st))
	
		int end = StackTop(&st);
		StackPop(&st);

		int begin = StackTop(&st);
		StackPop(&st);
	

		// 单趟排序
		int keyi = PartSort3(a, begin, end);  
		// 先入右区间
		if (keyi + 1 < end)
		
			StackPush(&st, keyi + 1);
			StackPush(&st, end);
		
		// 再入左区间
		if (begin < keyi - 1)
		
			StackPush(&st, begin);
			StackPush(&st, keyi - 1);
		
	

	StackDestroy(&st);

注:此处栈是用先前用C自己实现的栈功能。

以上是关于数据结构快速排序非递归实现的主要内容,如果未能解决你的问题,请参考以下文章

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现

数据结构排序

六千字快速复习七种常用排序

六千字快速复习七种常用排序

算法设计与分析分治法--快速排序的递归和非递归实现

快速排序-递归实现