STL算法 — partial_sort
Posted xfgnongmin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL算法 — partial_sort相关的知识,希望对你有一定的参考价值。
partial_sort接受一个middle迭代器。使序列中的middle-first个最小元素以递增顺序排序,置于[first, middle)内。以下是測试代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int a[] = {10,9,8,7,6,5,4,3,2,1,0};
vector<int> vec(a, a+11);
vector<int>::iterator b = vec.begin();
vector<int>::iterator e = vec.end();
partial_sort(b, b+6, e); // 前6个最小元素排序
while (b != e)
cout << *(b++) << ‘ ‘;
return 0;
}
partial_sort有两个版本号,一个默认以小于作为比較规则。出来的顺序为递增排列。
还有一个能够传入一个仿函数,即自己定义比較规则。这里仅仅分析前者。
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); // [first, middle)区间构造一个heap
for (RandomAccessIterator i = middle; i < last; ++i)
if (*i < *first) // 当前元素比堆中最大的元素小
__pop_heap(first, middle, i, T(*i), distance_type(first)); // first值放i中,i的原值融入heap并调整
sort_heap(first, middle);
}
究竟怎么做的?来看看__pop_heap函数:
template <class RandomAccessIterator, class T, class Distance>
inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last,
RandomAccessIterator result, T value, Distance*) {
*result = *first; // 弹出元素放vector尾端
__adjust_heap(first, Distance(0), Distance(last - first), value);
}
调整大致过程是找出最大元素放入first。然后把value保存的值插入到堆的适当位置,在这里value即为T(*i),即把i所指元素融入到了[first, middle)区间。
由此可见。__adjust_heap的复用性还是非常高的。
最后运行sort_heap(),由堆序变为增序排列:
template <class RandomAccessIterator>
void sort_heap(RandomAccessIterator first, RandomAccessIterator last) {
while (last - first > 1) pop_heap(first, last--);
}
若要对整个普通容器施行堆排序操作,能够借partial_sort接口,仅仅需把middle參数改为last就可以
: