C++_算法_排序及相关操作

①全部元素排序

template<class  RanIt> void sort(RanIt first, RanIt last);
template<class RanIt, class Pred> void sort(RanIt first, RanIt last, Pred pr);
template<class  RanIt> void stable_sort(RanIt first, RanIt last);
template<class RanIt, class Pred> void stable_sort(RanIt first, RanIt last, Pred pr);

说明:此种算法需访问随机存取迭代器。对容器中的所有元素进行排序。

②局部排序

void partial_sort(RandomAccessIterator _First, RandomAccessIterator _SortEnd, RandomAccessIterator _Last);
 void partial_sort(RandomAccessIterator _First, RandomAccessIterator _SortEnd, RandomAccessIterator _Last, BinaryPredicate _Comp);
RandomAccessIterator partial_sort_copy(InputIterator _First1, InputIterator _Last1, RandomAccessIterator _First2, RandomAccessIterator _Last2);
RandomAccessIterator partial_sort_copy(InputIterator _First1, InputIterator _Last1, RandomAccessIterator _First2, RandomAccessIterator _Last2, BinaryPredicate _Comp);

说明:前者是实现对区间[_First, _Last]内的元素进行排序;后者是将[_First1, _Last1]区间内的元素拷贝到[_First2, _Last2]并进行排序。

③根据某个元素排序

template<class RandomAccessIterator> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare> void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);

说明:此种算法对制定区间内的元素进行排序。和parital_sort()区别:前者是制定区间中的某个元素作为划分整个区间的界线,后者是指定某个位置作为作为分界线。

④堆操作
a.算法make_heap()

void make_heap(RandomAccessIterator _First, RandomAccessIterator _Last);
void make_heap(RandomAccessIterator _First, RandomAccessIterator _Last, BinaryPredicate _Comp);

说明:将区间[_First, _Last]中的元素转化为“堆”。

b.算法push_heap()

void push_heap(RandomAccessIterator _First, RandomAccessIterator _Last);
void push_heap(RandomAccessIterator _First, RandomAccessIterator _Last, BinaryPredicate _Comp);

说明:将新插入的元素放在堆栈末尾,使用此种算法时必须保证原有的元素是堆。

c.算法pop_heap()

void pop_heap(RandomAccessIterator _First, RandomAccessIterator _Last);
void pop_heap(RandomAccessIterator _First, RandomAccessIterator _Last, BinaryPredicate _Comp);

说明:删除堆中最大的元素,剩下的元素成为一个新的堆。

d.算法sort_heap()

void sort_heap(RandomAccessIterator _First, RandomAccessIterator _Last);
void sort_heap(RandomAccessIterator _First, RandomAccessIterator _Last, BinaryPredicate _Comp);

说明:此种算法使堆转化为一个已序的序列,算法执行之后,该区间及其区间内的元素不再是堆。

⑤合并排序
a.两个已序集合的总和

OutputIterator merge(IntputIterator first1, IntputIterator last1, IntputIterator first2, IntputIterator last2, OutputIterator x);
OutputIterator merge(IntputIterator first1, IntputIterator last1, IntputIterator first2, IntputIterator last2, OutputIterator x, Compare comp);

b.两个已序集合的并集

OutputIterator set_union(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result);
OutputIterator set_union(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result, BinaryPredicate _Comp);

说明:取两个区间的并集,并排序;当源区间内本身就含有重复元素时,使用该种算法,会保留这些重复元素,重复个数为两个源区间中重复个数较大的那个数值。

c.两个已序集合的交集

OutputIterator set_intersection(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result);
OutputIterator set_intersection(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result, BinaryPredicate _Comp);

说明:如果两个源区间内原来存在重复元素,新生成的目标区间也包含这些重复元素,重复个数为两个源区间中较小的那个重复个数。

d.两个已序集合的差集

OutputIterator set_difference(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result);
OutputIterator set_difference(IntputIterator _First1, IntputIterator _Last1, IntputIterator _First2, IntputIterator _Last2, OutputIterator _Result, BinaryPredicate _Comp);

说明:此种算法实现两个源区间之间的求差,新生成的区间中包含的元素为第一个源区间中有,而第二个源区间中没有的。

e.连贯的已序区间合并算法

void inplace_merge(BidirectionalIterator _First, BidirectionalIterator _Middle, BidirectionalIterator _Last);
void inplace_merge(BidirectionalIterator _First, BidirectionalIterator _Middle, BidirectionalIterator _Last, BinaryPredicate _Comp);

说明:将两个已序区间的元素合并,并形成新的区间。

⑥搜索
a.算法binary_search()

bool binary_search(ForwardIterator _First, ForwardIterator _Last, const Type& _Val);
bool binary_search(ForwardIterator _First, ForwardIterator _Last, const Type& _Val, BinaryPredicate _Comp);

说明:此种算法针对已序区间,查找是否包含值为_Val的元素。

b.算法includes()

inline bool includes(InputIterator1 First1, InputIterator1 Last1, InputIterator2 First2, InputIterator2 Last2);

说明:在指定源区间检查若干值是否存在。

c.搜索第一个或最后一个可能位置

lower_bound()
equal_range()
upper_bound()

说明:第一种指向值大于或等于value的第一个位置。第二种指向值大于value的第一个位置。第三种的返回值是前两种的共同返回值。

猜你喜欢

转载自blog.csdn.net/sss_0916/article/details/83790685