【算法】排序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);
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值