C++之STL中sort函数的内部实现(二)
另外一个版本:
先进行introsort,基本有序后再使用insertion sort。introsort是改进的quick sort,为了防止最坏情况发生,它使用__lg()函数控制分割恶化的情况。
- 元素个数检查,大于16个才进行后续操作;
- 分割层次检查,分割层次超过指定值就使用heap sort;
- 全部检查通过后使用quick sort,使用median-of-3方法确定枢轴位置;
- 对左右半段递归进行intro sort。
- 全部内容结束后, 序列已经基本有序,再次调用一次insertion sort。
inline void sort(RAIterator first, RAIterator last){
if(first != last){
__introsort_loop(first,last,value_type(first),__lg(last-first)*2);
__final_insertion_sort(first,last);//采用insertion sort
}
}
//控制分割恶化,找出满足2^k <= n时,k的最大值。
inline size __lg(size n){
size k;
for(k = 0; n > 1; n>>=1) ++k;
return k;
}
void __introsort_loop(RAIterator first,RAIterator last,T*,size depth_limit){
while(last - first > __stl_threshold){//全局常数__stl_threshold = 16
if(depth_limit == 0){
partial_sort(first,last,last);//分割恶化后改用heap sort
return;
}
--depth_limit;
//http://blog.csdn.net/u010902721/article/details/45868391
//上面这个链接里有介绍,__median是选三值的中值作为枢轴。下面这个函数是quick sort
RAIterator cut = __unguarded_partition(first,last,__median(*first,*(first+(last-first)/2),*(last-1)));
//递归右半段
__introsort_loop(cut,last,value_type(first),depth_limit);
last = cut;//回到while循环,对左半段再次进行sort
}
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++sort函数的各种用法
- 下一篇: C++sort函数使用总结