算法排序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:优化版快速排序非递归实现快速排序

数据结构:排序

数据结构—八大排序

八大排序算法

八大排序算法

快速排序算法的优化--三数取中法