由于之前在debug模式下发现stl的sort简直慢到不能忍,所以自己写了一个sgi的sort,后来发现在release模式下,vs自带的sort快的不行,就研究了下。
这里有些和sgi-stl相通的东西就简略带过了,详细内容可以看我之前的stl源码的笔记:
sgi-sort_link
首先来看下大概的过程:
1.没有调用到一定深度时,就进行划分并进行递归调用。
2.如果超过了一定深度时,这个区间改为调用堆排序。(这一部待商榷)
3.对剩下的小于32长度的区间进行插入排序。
接下来是详细分析:
1:当我们调用sort(frist,last);时,程序就来到下面的代码,帮忙添加一个参数:less<>()默认用<来比较。
template<class _RanIt> inline
void sort(_RanIt _First, _RanIt _Last)
{ // order [_First, _Last), using operator<
_STD sort(_First, _Last, less<>());
}
2:接着来到,这时会调用真正的sort,也就是_Sort
template<class _RanIt,
class _Pr> inline
void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)
{ // order [_First, _Last), using _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
_Sort(_Unchecked(_First), _Unchecked(_Last), _Last - _First, _Pred);
}
3:然后进入真正的sort:这里进行说明
template<class _RanIt,
class _Diff,
class _Pr> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal, _Pr _Pred)
{ // order [_First, _Last), using _Pred
_Diff _Count;