模板函数sort有两个重载版本
template<class _RanIt> inline
void sort(_RanIt _First, _RanIt _Last);
template<class _RanIt,
class _Pr> inline
void sort(_RanIt _First, _RanIt _Last, _Pr _Pred);
第一个版本使用小于操作符(operator<),第二个版本使用自定义的二元谓词(binary predicate)
其功能是实现一个区间内的元素的不稳定快速排序,下面针对源代码进行注释说明,以第一个版本为例
template<class _RanIt> inline
void sort(_RanIt _First, _RanIt _Last)
{ // order [_First, _Last), using operator<
_DEBUG_RANGE(_First, _Last);
std::_Sort(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Last - _First);
}
_Sort 函数,_ISORT_MAX == 32
template<class _RanIt,
class _Diff> inline
void _Sort(_RanIt _First, _RanIt _Last, _Diff _Ideal)
{ // order [_First, _Last), using operator<
_Diff _Count;
for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
{ // divide and conquer by quicksort
// 快速排序实现分治法
// 近似分区
pair<_RanIt, _RanIt> _Mid =
std::_Unguarded_partition(_First, _Last);
// 防止分区过多,逗号表达式
_Ideal /= 2, _Ideal += _Ideal / 2; // allow 1.5 log2(N) divisions
if (_Mid.first - _First < _Last - _Mid.second)
{ // loop on second half
// 左区间递归排序
std::_Sort(_First, _Mid.first, _Ideal);
// 更新整体区间起点
_First = _Mid.second;
}
else
{ // loop on first half
// 右区间递归排序
std::_Sort(_Mid.second, _Last, _Ideal);
// 更新整体区间终点
_Last = _Mid.first;
}
}
// _Ideal == 0
if (_ISORT_MAX < _Count)
{ // heap sort if too many divisions
// 分区达到最大值时采用堆排序
std::make_heap(_First, _Last);
std::sort_heap(_First, _Last);
}
else if (1 < _Count) // 元素较少时采用插入排序
std::_Insertion_sort(_First, _Last); // small
}
_Unguarded_partition和_Insertion_sort1 见文章《STL - nth_element》
make_heap见文章《STL - make_heap》
sort_heap见文章《STL - sort_heap》
代码来自于Microsoft Visual Studio 2008 SP1 安装包的algorithm文件,版本归原作者所有!