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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值