STL线性容器List成员函数sort的原理

《STL源码剖析》中,关于List的成员函数sort的原理做一说明,方便日后,再有人看见这段代码的时候,不明白其意,这段算法应该是归并排序,方法很巧妙,假如我们要排序的序列式{8,2,3,1,5,9,0,18,20},具体运行如下:

首先有一个序列数组,这个数组包含64个序列,第1个序列只容纳1个元素,第2个序列容纳2个元素,第3个序列容纳4个元素,第64个序列容纳2^63个元素,图示如下:


这个容器开始是空的,并且第一个序列只能容纳1个元素,第2个序列只能容纳2个元素,第n个序列可以容纳2^(n-1)个元素,归纳排序过程如下:

每次从原始序列中取出1个元素,然后看看序列1是否有元素,如果没有,则将该元素放入序列1,如果有,则合并序列1的元素,这时新元素和序列1的1个元素成为了含有2个元素的序列,这时,查看序列2是否为空,如果空,则将这个含有2个元素的序列放入序列2,如果不空,则让这个新序列和序列2再次合并成含有4个元素的新序列,然后再次查看序列3,如果序列3为空,则将长度为4的新序列放入序列3,否则继续合并,直到序列64也满,但是序列64可以容纳2^63个元素,所以现实排序的时候,不可能满,这个不用担心。这样当原始序列中的元素全部取出放入容器的相应序列中的时候,因为每个序列都已经是有序的,所以再对这64个序列进行合并,最后排序完成。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值