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?还未弄明白,留待弄明白后,再作记录……

posted @ 2012-12-17 18:25  crazylhf  阅读(291)  评论(0编辑  收藏  举报