码迷,mamicode.com
首页 > 其他好文 > 详细

STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy

时间:2014-07-20 23:37:44      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

partial_sort / partial_sort_copy

-----------------------------------------------------------------------------------------------------------------------------------------


描述:本算法接受一个 middle 迭代器(位于序列[first, last) 之列),然后重新安排[first, last),
使序列中的 middle - first 个最小元素以递增顺序排序,置于[first, last)内。
其余 last - middle 个元素安置于[middle, last)中,不保证有任何特定顺序。
思路:
算法内部采用 heap sort
1.用 make_heap() 将 [first, middle) 组织成一个 max-heap
2.将[middle,last) 中的每一个元素与 max-heap 的堆顶元素比较,如果小于该值,就互换位置并重新保持 max-heap 状态。
3.现在[first, middle)里保存的是较小的 middle - first 个元素,再使用 sort_heap() 对[first, middle] 排序就可以了
复杂度: 时间 klog(n) ?
图:6-11

源码:
template <class RandomAccessIterator>
inline void partial_sort(RandomAccessIterator first,
                         RandomAccessIterator middle,
                         RandomAccessIterator last) {
  __partial_sort(first, middle, last, value_type(first));
}

template <class RandomAccessIterator, class T>
void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
                    RandomAccessIterator last, T*) {
  make_heap(first, middle);
  for (RandomAccessIterator i = middle; i < last; ++i)
    if (*i < *first) 
      __pop_heap(first, middle, i, T(*i), distance_type(first));
  sort_heap(first, middle);
}

示例:
int A[] = {7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5};
const int N = sizeof(A) / sizeof(int);


partial_sort(A, A + 5, A + N);
copy(A, A + N, ostream_iterator<int>(cout, " "));
// The printed result is "1 2 3 4 5 11 12 10 9 8 7 6".


STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy,布布扣,bubuko.com

STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy

标签:style   blog   http   color   使用   os   

原文地址:http://blog.csdn.net/zhengsenlie/article/details/37994963

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!