链表的归并排序:来自STL_ list_ sort 算法

原创 2011年01月22日 11:36:00

侯捷STL源码剖析中列出了list的sort算法源码,感觉挺有意思:

 

template <class T, class Alloc>

void list<T,Alloc>::sort()

{

if (node->next==node||link_type(node->next)->next==node)

    return;

  list<T,Alloc> carry;

  list<T,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];32

}

 

其实就是归并排序,不过采用的不是自顶向下的递归,而是自底向上的归并。

counter数组用来保存有序的子串,其实就是起到递归栈的作用。其中counter[i]保存的是长度为2i的子串。carray是一个临时容器。

归并的顺序大致是这样的:首先从原list中取一个元素,将这个元素看做是一个长度为k=1的串,然后从counter数组的第i=1个list开始检查,如果这个list为空,则将子串放入counter[i];否则将carry和counter[i]归并为长度为2k的子串,再检查counter[i+1],以此类推。当原list为空时,将counter数组中各list归并起来就可以了。

 

因此我认为fill这个变量唯一的意义就在于记录一下counter数组最大利用长度,提高一下最终归并(最后一个for循环)的效率而已。

 

这个算法的实现限定了它所能排序的最长list为 264-1,这个数也确实足够大了。

 

一般来说程序里面不应该出现所谓的魔法数字,上面的(64),不过STL都在此处如此使用,看来只要有足够的理由(264-1对一般程序来说已经是个天文数字),规则也是可以打破的。硬编码的数组可以让代码更加干净整洁。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【LeetCode】 sort list 单链表的归并排序

题目:Sort a linked list in O(n log n) time using constant space complexity. 思路:要求时间复杂度O(nlogn) 知识点:归...

【leetcode 单链表归并排序】Sort List

1、题目 2、分析 3、归并排序代码 4、快速排序代码

[leetcode] 134 Sort List (链表 & 归并排序)

首先看到题目中要求时间复杂度 O(n log n),时间复杂度为常数的时候,先将最容易实现的插入排序排除(O(n^2));接着想到快速排序和归并排序, 但是快速排序的最坏时间复杂度也为O(n^2),...

Leetcode Sort List 链表归并排序

本题好像使用quicksort是不能AC的,只能使用归并排序了。 之前觉得是很困难的题目。 训练了这么久算法,功力终于上升了。虽然还没达化境,但是以前觉得什么归并排序,快速排序好像很难,曾经死记过,始...

[C++]LeetCode: 125 Sort List (归并排序链表)

题目:Sort a linked list in O(n log n) time using constant space complexity. 思路:题目要求我们使用常数空间复杂度,时间复杂度为...

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

由于STL中提供的sort算法是用在RandomAccessIterator上的,而list迭代器不具备随机访问的特性,所以对list进行排序不能使用algorithm中的sort算法,而应该使用li...

leetcode_效率题解_148. Sort List_(链表归并排序)

相关题解: leetcode_效率题解_[python/C++]_147. Insertion Sort List(链表插入排序)题目链接 【题目】 Sort a linked list in ...

STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort

SGI STL 的源代码(选自 STL 源码分析)如下: // list 不能使用 STL 算法 sort () // 因为 STL 算法 sort() 只接受 RandomAccessIterato...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)