快速排序

int GetMid(int a[], int left, int right)//三数取中
{
	int mid = left + (right - left) / 2;
	if (a[left] <a[right])
	{
		if (a[mid] < a[left])
		{
			return left;
		}
		else
		{
			if (a[mid]>a[right])
			{
				return right;
			}
			else
			{
				return mid;
			}
		}
	}
	else
	{
		if (a[right] > a[mid])
		{
			return right;
		}
		else
		{
			if (a[mid] > a[left])
			{
				return left;
			}
			else
			{
				return mid;
			}
		}
	}
}


//递归实现
void Re_FastSort(int a[], int left, int right)
{
	if (left >= right)
	{
		return;
	}
	if (right - left < 13)
	{
		InsertSort(a, right - left + 1);
		return;
	}
	int begin = left;
	int end = right;
	int key = GetMid(a, left, right);
	swap(a[left], a[key]);
	int temp = a[left];
	while (begin < end)
	{
		while (begin<end&&a[end]>temp)
		{
			end--;
		}
		if (begin < end)
		{
			a[begin] = a[end];
			begin++;
		}
		while (begin<end&&a[begin]<temp)
		{
			begin++;
		}
		if (begin < end)
		{
			a[end] = a[begin];
			end--;
		}
	}
	a[begin] = temp;
	Re_FastSort(a, left, begin - 1);
	Re_FastSort(a, begin + 1, right);
}

//栈实现
#include<stack>
void NoRe_FastSort(int a[], int left, int right)
{
	assert(a);
	struct left_right
	{
		int _left;
		int _right;
		left_right(int left, int right)
			:_left(left)
			, _right(right)
		{}
	};
	stack<left_right>s;
	s.push(left_right(left, right));
	while (!s.empty())
	{
		int begin = s.top()._left;
		int end = s.top()._right;
		s.pop();

		int key = GetMid(a, begin, end);
		swap(a[begin], a[key]);
		int temp = a[begin];

		int tmpbegin = begin;
		int tmpend = end;
		while (tmpbegin < tmpend)
		{
			while (tmpbegin < tmpend && a[tmpend] > temp)
			{
				tmpend--;
			}
			if (tmpbegin < tmpend)
			{
				a[tmpbegin] = a[tmpend];
				tmpbegin++;
			}
			while (tmpbegin < tmpend && a[tmpbegin] < temp)
			{
				tmpbegin++;
			}
			if (tmpbegin < tmpend)
			{
				a[tmpend] = a[tmpbegin];
				tmpend--;
			}
		}
		a[tmpbegin] = temp;
		if (tmpbegin - 1>begin)
		{
			s.push(left_right(begin, tmpbegin - 1));
		}
		if (tmpbegin + 1 < end)
		{
			s.push(left_right(tmpbegin + 1, end));
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值