为什么set/map底层用红黑树而不用AVL树?
红黑树与AVL比较:
AVL是严格平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率降低;红黑树是弱平衡的,算是一种折中,插入最多旋转2次,删除最多旋转3次。
红黑树在查找、插入删除的复杂度都是O(logn),且性能稳定,所以STL里面很多结构包括map底层都是使用的红黑树。
STL的sort内部使用什么排序算法?
直接上源码
1 | template <class _RanIt, class _Pr> |
这是一个入口函数,先检查迭代器的区间是不是合法的,然后进入主要的排序函数,下面看排序函数是怎么工作的。
1 | template <class _RanIt, class _Pr> |
这是一个递归函数,注释可以说是非常清晰了。
- 首先检查要排序的长度,如果长度小于_ISORT_MAX = 32,那么直接进行插入排序。主要的想法是
在32这么一个量级上序列基本上已经有序,使用插入排序效率已经相对较高。 - 然后检查递归深度,没进行一次递归,就对_Ideal进行 _Ideal = (_Ideal >> 1) + (_Ideal >> 2)操作,
主要的作用是防止快排递归深度过深导致爆栈。 - 如果深度可以接受,进行快排。