最近在看STL源码解析的时候,在看到SGI STL sort的部分是,对std::sort的最后一步__final_insertion_sort(插入排序),比较迷惑。
template <class RandomAccessIterator>
void __final_insertion_sort(RandomAccessIterator first,
RandomAccessIterator last) {
if (last - first > __stl_threshold) {
__insertion_sort(first, first + __stl_threshold);
__unguarded_insertion_sort(first + __stl_threshold, last);
}
else
__insertion_sort(first, last);
}
它使用了些优化技巧,让人难以理解。
它被分成了两个分支,前一个分支是处理大于分段阈值的情况,后一个分支处理小于等于分段阈值。
第一个问题:为什么要划分成两种情况不同对待?
第二个问题,第一个分支中又将区间分成了两段,前16个和剩余部分,然后分别调用两个排序。为什么要这么分段?
第三个问题,__insertion_sort和__unguarded_insertion_sort有何区别?
这此问题便是我看到这个实现的疑惑,为什么不直接使用__insertion_sort插入排序?但是很遗憾的是《STL源码剖析》并未讲得很清楚,网上也有类似的讨论,都说是为了优化,但为何这样便能优化,还是没有答案。如果你也无法回答上述三个问题,请看下面这篇博文,讲得挺好。
http://feihu.me/blog/2014/sgi-std-sort/#为何__final_insertion_sort如此实现