VC的std::sort有几处没看懂,大侠帮忙解释一下吧

zserewr 2016-01-04 09:14:59
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
}

问题:
1. for循环的这句话:
for (; _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal; )

这个&&0,和一个0做逻辑与,不就总是0吗,也就是说这个for循环根本不能执行?

2. for循环如果执行的话,那么在for的内部就递归调用了sort。什么时候会推出for循环来执行后面的if/else呢?
因为任何一种递归的排序实现,似乎都能用递归本身完成,不需要推出递归以后,再做别的处理。看不出来什么条件下,会执行到if/else

谢谢。
...全文
131 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-01-04
  • 打赏
  • 举报
回复
1、注意运算符优先集,&&低于< 2、如果看不懂,自己实现排序一个元素不多的数组,然后单步运行程序,看他怎么跳出的 另外,建议先看《STL 源码剖析》, SGI STL 比VC的STL代码可读性高,SGI STL也是满足你所说的“号称”
windsnow263 2016-01-04
  • 打赏
  • 举报
回复
什么时候会推出for循环来执行后面的if/else呢? 当然是不再满足for循环条件的时候
辰岡墨竹 2016-01-04
  • 打赏
  • 举报
回复
_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal < 的运算优先级比 && 高,所以是 _ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal
赵4老师 2016-01-04
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
yshuise 2016-01-04
  • 打赏
  • 举报
回复
不要看vc的stl,看sgi的stl

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧