STL之list的sort函数

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  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值