- 論壇徽章:
- 0
|
本帖最后由 zserewr 于 2016-01-04 10:33 編輯
VC std::sort,號稱是首先嘗試快速排序,然后在適當(dāng)?shù)臅r候改為堆排序和插入排序:
-----------------------------------
- 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
- }
復(fù)制代碼 問題:
for循環(huán)如果執(zhí)行的話,那么在for的內(nèi)部就遞歸調(diào)用了sort。什么時候會推出for循環(huán)來執(zhí)行后面的if/else呢?
因為任何一種遞歸的排序?qū)崿F(xiàn),似乎都能用遞歸本身完成,不需要推出遞歸以后,再做別的處理?床怀鰜硎裁礂l件下,會執(zhí)行到if/else
謝謝。 |
|