list底层数据结构采用的是循环双向链表.同时,list并没采用algorithm提供的内置sort函数,而是自定义了一个sort成员函数.
该sort,采用的是一种特殊的归并排序,支持的对大排序数为2^64-1.
list的sort函数源码如下:
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::sort()
{
// Do nothing if the list has length 0 or 1.
if (_M_node->_M_next != _M_node &&
((_Node*) (_M_node->_M_next))->_M_next != _M_node) {
list<_Tp, _Alloc> __carry;
list<_Tp, _Alloc> __counter[64];
int __fill = 0;
while (!empty()) {
__carry.splice(__carry.begin(), *this, begin());
int __i = 0;
while(__i < __fill && !__counter[__i].empty()) {
__counter[__i].merge(__carry);
__carry.swap(__counter[__i++]);
}
__carry.swap(__counter[__i]);
if (__i == __fill) ++__fill;
}
for (int __i = 1; __i < __fill; ++__i)
__counter[__i].merge(__counter[__i-1]);
swap(__counter[__fill-1]);
}
}
下面是我的测试程序和测试结果
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
typedef list<int> IList;
void print(const IList& list) {
IList::const_iterator ite = list.begin();
for (; ite != list.end(); ++ite) {
cout << *ite << " ";
}
cout << endl;
}
int main() {
IList s;
s.push_back(7);
s.push_back(6);
s.push_back(5);
s.push_back(4);
s.push_back(3);
s.push_back(2);
s.push_back(1);
s.push_back(0);
IList carry;
IList counter[64];
int fill = 0;
int num = 0;
while (!s.empty()) {
cout << "取第" << num << "个数据: fill = " << fill << endl;
carry.splice(carry.begin(), s, s.begin());
list<int>::iterator ite = carry.begin();
while( ite != carry.end()) {
cout<<*ite++<<" ";
}
cout<<endl;
int i = 0;
while (i < fill && !counter[i].empty()) {
counter[i].merge(carry);
carry.swap(counter[i++]);
}
carry.swap(counter[i]);
if (i == fill)
++fill;
//我自己加的计数
num++;
//打印每次完的结果
for (int i = 0; i < fill; ++i) {
cout << i << "==";
print(counter[i]);
}
}
for (int i = 1; i < fill; ++i)
counter[i].merge(counter[i - 1]);
s.swap(counter[fill - 1]);
getchar();
return 0;
}
测试结果:
取第0个数据: fill = 0
7
0==7
取第1个数据: fill = 1
6
0==
1==6 7
取第2个数据: fill = 2
5
0==5
1==6 7
取第3个数据: fill = 2
4
0==
1==
2==4 5 6 7
取第4个数据: fill = 3
3
0==3
1==
2==4 5 6 7
取第5个数据: fill = 3
2
0==
1==2 3
2==4 5 6 7
取第6个数据: fill = 3
1
0==1
1==2 3
2==4 5 6 7
取第7个数据: fill = 3
0
0==
1==
2==
3==0 1 2 3 4 5 6 7