64,649
社区成员
发帖
与我相关
我的任务
分享
template<class _Pr2>
void sort(_Pr2 _Pred)
{ // order sequence, using _Pred
if (2 <= this->_Mysize)
{ // worth sorting, do it
const size_t _MAXBINS = 25;
_Myt _Templist(this->_Getal()), _Binlist[_MAXBINS + 1];
size_t _Maxbin = 0;
while (!empty())
{ // sort another element, using bins
_Templist._Splice_same(_Templist.begin(), *this, begin(),
++begin(), 1);
size_t _Bin;
for (_Bin = 0; _Bin < _Maxbin && !_Binlist[_Bin].empty();
++_Bin)
{ // merge into ever larger bins
_Binlist[_Bin].merge(_Templist, _Pred);
_Binlist[_Bin].swap(_Templist);
}
if (_Bin == _MAXBINS)
_Binlist[_Bin - 1].merge(_Templist, _Pred);
else
{ // spill to new bin, while they last
_Binlist[_Bin].swap(_Templist);
if (_Bin == _Maxbin)
++_Maxbin;
}
}
for (size_t _Bin = 1; _Bin < _Maxbin; ++_Bin)
_Binlist[_Bin].merge(_Binlist[_Bin - 1],
_Pred); // merge up
_Analysis_assume_(0 < _Maxbin);
splice(begin(), _Binlist[_Maxbin - 1]); // result in last bin
}
}
vs2015中的实现:
template<class _Pr2>
iterator _Sort(iterator _First, iterator _Last, _Pr2 _Pred,
size_type _Size)
{ // order [_First, _Last), using _Pred, return new first
// _Size must be distance from _First to _Last
if (_Size < 2)
return (_First); // nothing to do
iterator _Mid = _STD next(_First, _Size / 2);
_First = _Sort(_First, _Mid, _Pred, _Size / 2);
_Mid = _Sort(_Mid, _Last, _Pred, _Size - _Size / 2);
iterator _Newfirst = _First;
for (bool _Initial_loop = true; ; _Initial_loop = false)
{ // [_First, _Mid) and [_Mid, _Last) are sorted and non-empty
if (_DEBUG_LT_PRED(_Pred, *_Mid, *_First))
{ // consume _Mid
if (_Initial_loop)
_Newfirst = _Mid; // update return value
splice(_First, *this, _Mid++);
if (_Mid == _Last)
return (_Newfirst); // exhausted [_Mid, _Last); done
}
else
{ // consume _First
++_First;
if (_First == _Mid)
return (_Newfirst); // exhausted [_First, _Mid); done
}
}
}
另外有一篇博客给的不知是什么版本编译器的实现:http://blog.csdn.net/qq276592716/article/details/7932483
都是用的归并排序的思想,不过通过迭代器互换或者移动的方式替换了传值,算是变种吧,具体细节的差别是随着
编译器的发展改变的,似乎越越来越能看懂了。。效率方面就不清楚了