赞
踩
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void sort() {
//其意义是if(empty() || size()==1 ) 但是这样做没有效率
if (node->next == node || node->next->next == node)return;
list carry;//缓冲链表
list counter[64];//链表数组,也是缓冲数组的counter[i]代表第i个位置上元素有2的i次方个 int fill = 0;//表示在counter[64]这个数组里面用了多少
while (!empty()) { carry.splice(carry.begin(),*this,begin());//把首节点放入缓冲链表
int i = 0;
/*
*一开始carry 获得一个节点,但是不足以启动以下循环,然后这个节点
*被交换到counter[0], fill++,第二次carry 获得一个节点(此时仍然
*只有一个节点),启动下面的循环一次,counter[0]合并和carry,此时counter[0]
*有两个节点,然后counter[0]的内容被交换给carry,循环结束,经过下面两步后
*fill=2,carry 重新为空,counter[0]为空,counter[1]有两个节点
*如此上述过程,每次从list取一个元素,让其存在于counter链表数组中
*最终归并
*/
while (i < fill && !counter[i].empty())
{
counter[i].merge(carry);//把缓冲carry合并到这个list
carry.swap(counter[i++]);//把这个list重新换给缓冲carry
}
carry.swap(counter[i]);//循环结束把缓冲carry的内容换到缓冲数组上
if (i == fill)
++fill;
}
for (int i = 1;i < fill;++i)
counter[i].merge(counter[i - 1]);
swap(counter[fill - 1]);
}
可以参考一下STL双链表的 归并排序
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。