STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过《STL源码剖析》的原文中,我有些许疑问,对于该排序算法,侯认为是采用了快排,但是经过仔细分析,我认为是采用了归并来实现的。
list::sort函数的实现位于stl_list.h文件,源码及注释如下:
template <class T, class Alloc> void list<T, Alloc>::sort() {
if (node->next == node || link_type(node->next)->next == node) return;
list<T, Alloc> carry;
// 对于索引i的元素counter[i],存放的是节点数为2^i的list数据
list<T, Alloc> counter[64];
int fill = 0;
while (!empty()) {
//每次循环,都从当前list中取出头结点,接合到carry中去
//即每次循环开始时,carry都只从当前list中取出一个结点(头结点)
carry.splice(carry.begin(), *this, begin());
int i = 0;
while(i < fill && !counter[i].empty()) {
//从索引0开始,将carry中的list结点归并到counter[i]中去
counter[i].merge(carry);
//执行交换操作,将归并后的结果存入carry,交换前,carry为空,交换后counter[i]为空
carry.swap(counter[i++]);
}
carry.swap(counter[i]);
if (i == fill) ++fill;
//记录counter中当前已经填充了数据的元素的最高索引
}
for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);
//将counter中遗留的元素归并 swap(counter[fill-1]);
//将排序后的结果换入当前list所在的空间上
}
遗留问题:counter[64],为什么要用64?还未弄明白,留待弄明白后,再作记录……