算法排序3:优化版快速排序非递归实现快速排序

Posted 一只当归

tags:

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

快速排序整体的综合性能和使用场景都是较好的,但在有序的情况下快速排序反倒会变得慢起来,这时使用三数取中法可以把有序这种最坏情况变成最优解,实现快速排序的优化。

int GetMidIndex(int* a, int begin, int end)
{
	int mid = (begin + end) >> 1; //采用移位的方式除二
	if (a[begin] < a[mid])
	{
		if (a[mid] < a[end])
		{
			return mid;
		}
		else if (a[begin] < a[end])
		{
			return end;
		}
		else{
			return begin;
		}
	}
	else if (a[begin] > a[mid])
	{
		if (a[mid] > a[end])
		{
			return mid;
		}
		else if (a[begin] < a[mid])
		{
			return begin;
		}
		else{
			return end;
		}
	}

}
int PrevCurMethod(int* a, int begin, int end) //前后指针实现单趟排序
{
	int midindex = GetMidIndex(a, begin, end);
	Swap(&a[midindex], &a[end]);
	int prev = begin - 1;
	int cur = begin;
	int key = a[end];
	while (cur < end) //遇到key就结束了
	{
		if (a[cur] < key && ++prev != cur)
		{
			Swap(&a[prev], &a[cur]);
		}
		++cur;
	}
	++prev;
	Swap(&a[prev], &a[end]);
	return prev;
}
int QuickSort(int* a, int begin, int end)  //应用递归的思想
{
	if (begin >= end)
		return;
	int keyindex = PrevCurMethod(a, begin, end); //使用前后指针
	QuickSort(a, begin, keyindex - 1);
	QuickSort(a, keyindex + 1, end);
}

同样的,在一些特殊情况下我们还可以使用非递归来实现快速排序,非递归实现快速排序的重点就是使用数据结构的栈来模拟递归。

void QuickSortNonR(int* a, int begin, int end)
{
	Stack st;
	StackInit(&st);
	StackPush(&st, begin);
	StackPush(&st, end);
	while (!StackEmpty(&st))
	{
		int right = StackTop(&st);
		StackPop(&st);
		int left = StackTop(&st);
		StackPop(&st);
		int keyindex = PrevCurMethod(a, left, right);
		if (left < keyindex-1)
		{
			StackPush(&st, left);
			StackPush(&st,keyindex-1);
		}
		if (keyindex+1 < right)
		{
			StackPush(&st, keyindex+1);
			StackPush(&st,right);
		}
	}
	StackDestroy(&st);
}

以上是关于算法排序3:优化版快速排序非递归实现快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序3:优化版快速排序非递归实现快速排序

基于比较的七种常见排序算法

基于比较的七种常见排序算法

基于比较的七种常见排序算法

C语言实现九大排序算法(建议收藏!)

C语言实现九大排序算法(建议收藏!)