STL源码——list sort:归并排序的非递归实现

本文探讨了STL中list的sort成员函数如何实现非递归版的归并排序,该方法通过避免在寻找中点时的线性复杂度,以空间换取时间效率。尽管如此,由于list的特殊性,在merge过程中并未额外占用元素空间。通过将有序子序列保存并逐步merge,根据二进制表示的链表长度确定子序列数量,并使用类似加法进位的方式进行元素归并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于STL中提供的sort算法是用在RandomAccessIterator上的,而list迭代器不具备随机访问的特性,所以对list进行排序不能使用algorithm中的sort算法,而应该使用list的成员函数sort。对list进行排序,最直接的想法就是用MergeSort,但是每次找中点就需要O(n),可能考虑到这点,成员函数sort并没有采用这种方式实现,而是用了非递归版的MergeSort,将待归并的子序列先保存下来,感觉有点以空间换时间的意思。(更正!由于list链表的特殊性,在进行swap和merge并没有使用额外的空间,所以最多只是牺牲了常数个list结构的空间,而元素本身并没有占用多余的空间。所以并没有牺牲空间)

主要想法就是,将已经有序的子序列先保存下来,然后再一一进行merge。那到底有多少个子序列需要merge呢?每个子序列又如何确定呢?虽然是非递归版MergeSort,但本质思想是一样的,子序列也是由一系列更小的子序列merge而来的。可以将list的长度len表示成二进制形式,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值