- 论坛徽章:
- 0
|
本帖最后由 zserewr 于 2016-01-04 10:33 编辑
VC std::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;
- for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )
- { // divide and conquer by quicksort
- _STD pair<_RanIt, _RanIt> _Mid =
- _Unguarded_partition(_First, _Last, _Pred);
- _Ideal /= 2, _Ideal += _Ideal / 2; // allow 1.5 log2(N) divisions
- if (_Mid.first - _First < _Last - _Mid.second)
- { // loop on second half
- _Sort(_First, _Mid.first, _Ideal, _Pred);
- _First = _Mid.second;
- }
- else
- { // loop on first half
- _Sort(_Mid.second, _Last, _Ideal, _Pred);
- _Last = _Mid.first;
- }
- }
- if (_ISORT_MAX < _Count)
- { // heap sort if too many divisions
- _STD make_heap(_First, _Last, _Pred);
- _STD sort_heap(_First, _Last, _Pred);
- }
- else if (1 < _Count)
- _Insertion_sort(_First, _Last, _Pred); // small
- }
复制代码 问题:
for循环如果执行的话,那么在for的内部就递归调用了sort。什么时候会推出for循环来执行后面的if/else呢?
因为任何一种递归的排序实现,似乎都能用递归本身完成,不需要推出递归以后,再做别的处理。看不出来什么条件下,会执行到if/else
谢谢。 |
|