STL源码分析:2---STL内置sort的性能优化

今天又看了一遍sort源码,忽然发现一个问题:

template<typename _RandomAccessIterator, typename _Compare>
inline _RandomAccessIterator
__unguarded_partition_pivot(_RandomAccessIterator __first,
                            _RandomAccessIterator __last, _Compare __comp) {
	_RandomAccessIterator __mid = __first + (__last - __first) / 2;//@看这里!!!
	std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
	                            __comp);
	return std::__unguarded_partition(__first + 1, __last, __first, __comp);
}

代码中注释所在的那一行,二分枢纽取了数组中间位置的值,数据结构知识告诉我们这么随意的取值可能导致sort性能下降,于是我将其取枢纽代码改了一下:

//原来是这样
_RandomAccessIterator __mid = __first + (__last - __first) / 2;

//改成这样>>>
template <class T>
inline const T& __median(const T& a, const T& b, const T& c) {
	if( a < b ) {
		if( b < c ) 		//a<b<c
			return b;
		else if( a < c)		// a < b, b >= c, a<c
			return c;
		else
			return a;
	} else if( a < c)			// c > a >= b
		return a;
	else if( b < c)			// a >= b, a >= c, b < c
		return c;
	else
		return b;
}
_RandomAccessIterator __mid = __median(__first,__first + (__last - __first),__last);

也就是把取中间位置的元素作为枢纽改成了取首、中、尾三位置的中间值作为枢纽。测试了一下,发现效率提高百分之七左右,当然我的测试并不完善,此改动的效果还需要在实践中去探索。

没想到gccSTL里的sort函数实现还有这样的小瑕疵😐
抽空去提个issue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值