当前位置:   article > 正文

c语言两个链表归并排序,归并排序链表实现

归并排序两个链表

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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双链表的 归并排序

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/174262
推荐阅读
相关标签
  

闽ICP备14008679号