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

【数据结构】快速排序非递归实现_第1张图片

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

OJ链接


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

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

解题思想

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

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

图解过程

【数据结构】快速排序非递归实现_第2张图片

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

【数据结构】快速排序非递归实现_第3张图片

栈中数据:

【数据结构】快速排序非递归实现_第4张图片

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

【数据结构】快速排序非递归实现_第5张图片

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

程序代码

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自己实现的栈功能。

你可能感兴趣的:(【数据结构】,数据结构,栈)