快速排序

今晚日了狗了,快速排序很久以前就写过,今天写了一下确经常出现死循环,调了一晚上才调出来

bool comp(const T& a, const T&b)
{
	return a < b;
}
template <typename T>
void quicksort(T *begin, T *end ,bool(*func)(const T&a, const T & b) = comp)
{
	if (begin >= end-1)
		return;
	T *i, *j;
	i = begin + 1;
	j = end - 1;
	while (i < j)
	{
		//问题出在这里,递增i时必须是<=,递减j的时候同理,必须是>=,测试数据如三个相同的数据{99,99,99},如果没有等号则陷入死循环
		while (i < j&&(func(*i, *begin)||!func(*begin,*i)))
			++i;
		while (j > i&&(func(*begin, *j)||!func(*j,*begin)))
			--j;
		if (i != j)
		{
			T temp = *i;
			*i = *j;
			*j = temp;
		}
	}
	//对于这里的判断,是这个代码的缺陷。先递增i再递减j,就会出现当i=j时,要比较begin和*i
	T *t;
	if (func(*i, *begin))
		t = i;
	else
		t = i - 1;
	T temp = *t;
	*t = *begin;
	*begin = temp;
	if (t != begin)
	{
		quicksort(begin, t, func);
	}
	quicksort(t+1, end,func);
}
换了种思路重写,看起来就清爽了很多

template <typename T>
void quicksort(T *begin, T *end, bool(*func)(const T &a, const T &b) = comp)
{
	if (begin >= end-1)
		return;
	T temp = *begin;
	T *i = begin;
	T *j = end-1;
	while (i < j)
	{
		while ((func(temp, *j)||!func(*j,temp)) && j>i)
			--j;
		while ((func(*i, temp)||!func(temp,*i)) && i < j)
			++i;
		if (i < j)
		{
			T sp = *i;
			*i = *j;
			*j = sp;
		}
	}
	*begin = *i;
	*i = temp;
	quicksort(begin, i, func);
	quicksort(i + 1, end, func);
}



测试代码如下

int main()
{
	srand((unsigned int)time(NULL));
	int n;
	while (cin>>n&&n)
	{
		
		int *buf = new int[n];
		for (int i = 0;i < n;++i)
		{
			buf[i] = rand() % 100;
			cout << buf[i] << ' ';
		}
		cout << endl;
		quicksort(buf, buf + n);
		for (int i = 0;i < n;++i)
		{
			cout << buf[i] << ' ';
		}
		cout << endl;
		delete[] buf;
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值