C++ 标准模板库中的排序
来源:互联网 发布:南风知我意七微全文 编辑:程序博客网 时间:2024/06/03 07:05
partial_sort()函数
partial_sort接受一个middle迭代器,使序列中的middle-first个最小元素以递增顺序排序,置于[first, middle)内。
template <class RandomAccessIterator> void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
//包含比较函数的声明template <class RandomAccessIterator, class Compare> void partial_sort (RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
示例代码:
int a[] = {1,4,3,6,7,2,5};vector<int> v1(a, a + 7);partial_sort(v1.begin(), v1.begin() + 3, v1.end());
partial_sort_copy()函数
参数意思和partial_sort()函数一样,多出来的是将排序的这部分存入到以result_first为首指针的数组中去(不超过result_last 尾指针),如果原来存储了内容,就覆盖。
template <class InputIterator, class RandomAccessIterator> RandomAccessIterator partial_sort_copy ( InputIterator first,InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last ); //返回值:指向结果序列中写入的最后一个元素之后的元素的迭代器。
//包含比较函数的声明template <class InputIterator, class RandomAccessIterator, class Compare> RandomAccessIterator partial_sort_copy ( InputIterator first,InputIterator last, RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp ); //返回值:指向结果序列中写入的最后一个元素之后的元素的迭代器。
示例代码:
int a[] = {1,4,3,6,7,2,5};vector<int> v1(a, a + 7), v2;vector<int>::iterator i1;i1 = partial_sort_copy(v1.begin(), v1.begin() + 4, v2.begin(), v2.end());
sort
对给定区间所有元素进行排序
template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);
//包含比较函数的声明template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
示例代码:
int a[] = {1,4,3,6,7,2,5};vector<int> v1(a, a + 7);sort(v1.begin(), v1.begin() + 3, v1.end());
stable_sort
stable_sort()可以对vector的成员进行排序,可保证相等元素的原本相对次序在排序后保持不变
template <class RandomAccessIterator> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
//包含比较函数的声明template <class RandomAccessIterator, class Compare> void stable_sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
示例代码:
int a[] = {1,4,3,6,7,2,5};vector<int> v1(a, a + 7);stable_sort(v1.begin(), v1.begin() + 3, v1.end());
sort_heap:
将一个堆做排序,最终成为一个有序的系列,可以看到sort_heap时,必须先是一个堆(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),因此必须先做一次make_heap.
几个相关的函数:
- make_heap:将[start, end)范围进行堆排序,默认使用less< int >, 即最大元素放在第一个
- push_heap:将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap
- pop_heap:对刚插入的(尾部)元素做堆排序
template <class RandomAccessIterator> void sort_heap (RandomAccessIterator first, RandomAccessIterator last);
示例代码:
int a[] = {1,4,3,6,7,2,5};vector<int> v1(a, a + 7);make_heap(v1.begin(), v1.end());sort_heap(v1.begin(), v1.end());
//包含比较函数的声明template <class RandomAccessIterator, class Compare> void sort_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
完整代码如下:
#include <iostream>#include <vector>#include <algorithm>#include <functional> //greater()using namespace std;class Person{public: Person(char *ch = "", int n = 0){ name = strdup(ch); age = n; } bool operator==(const Person &p) const { return strcmp(name, p.name) == 0; } bool operator<(const Person &p) const { return strcmp(name, p.name) < 0; }private: char *name; int age; friend ostream &operator<<(ostream &out, const Person &p){ out << "(" << p.name << "," << p.age << ")"; return out; }};bool f1(int n){ return n < 5;}template<class T>void printVector(char *s, const vector<T> &v){ cout << s << " = ("; if(v.size() == 0){ cout << ")\n"; return ; } vector<T>::const_iterator i; for(i = v.begin(); i != v.end() - 1; i++) cout << *i << ','; cout << *i << ")\n";}int main(){ int a[] = {1,4,3,6,7,2,5}; vector<int> v1(a, a + 7), v2(a, a + 7), v3(6, 9), v4(6, 9); vector<int>::iterator i1, i2, i3, i4; partial_sort(v1.begin(), v1.begin() + 3, v1.end()); printVector("v1", v1); partial_sort(v2.begin() + 1, v2.begin() + 4, v2.end(), greater<int>()); printVector("v2", v2); i3 = partial_sort_copy(v2.begin(), v2.begin() + 4, v3.begin(), v3.end()); printVector("v3", v3); cout << *(i3 - 1) << ' ' << *i3 << endl; i4 = partial_sort_copy(v1.begin(), v1.begin() + 4, v4.begin(), v4.end(), greater<int>()); printVector("v4", v4); cout << *(i4 - 1) << ' ' << *i4 << endl; i1 = partition(v1.begin(), v1.end(), f1); printVector("v1", v1); cout << *(i1 - 1) << ' ' << *i1 << endl; i2 = partition(v2.begin(), v2.end(), bind2nd(less<int>(), 5)); printVector("v2", v2); cout << *(i2 - 1) << ' ' << *i2 << endl; sort(v1.begin(), v1.end()); sort(v1.begin(), v1.end(), greater<int>()); vector<Person> pv1, pv2; for(int i = 0; i < 20; i++){ pv1.push_back(Person("Josie", 60 - i)); pv2.push_back(Person("Josie", 60 - i)); } sort(pv1.begin(), pv1.end()); stable_sort(pv2.begin(), pv2.end()); vector<int> heap1, heap2, heap3(a, a + 7), heap4(a, a + 7); for(int i = 0; i < 7; i++){ heap1.push_back(i); push_heap(heap1.begin(), heap1.end()); printVector("heap1", heap1); } sort_heap(heap1.begin(), heap1.end()); for(int i = 0; i < 7; i++){ heap2.push_back(i); push_heap(heap2.begin(), heap2.end(), greater<int>()); printVector("heap2", heap2); } sort_heap(heap2.begin(), heap2.end(), greater<int>()); printVector("heap2", heap2); make_heap(heap3.begin(),heap3.end()); sort_heap(heap3.begin(), heap3.end()); make_heap(heap4.begin(),heap4.end(), greater<int>()); printVector("heap4", heap4); sort_heap(heap4.begin(),heap4.end(), greater<int>()); printVector("heap4", heap4); return 0;}
PS:比较函数 greater<T>()
//重载括号为比较大小template <class T> struct greater : binary_function <T,T,bool> { bool operator() (const T& x, const T& y) const {return x>y;}};
less<T>()
//重载括号为比较大小template <class T> struct less : binary_function <T,T,bool> { bool operator() (const T& x, const T& y) const {return x<y;}};
阅读全文
0 0
- C++ 标准模板库中的排序
- C++中的标准模板库STL及容器
- C++:标准模板库(STL)
- C++:标准模板库vector
- C++:标准模板库map
- C++:标准模板库string
- C++:标准模板库Sort
- C++STL标准模板库
- 标准库:标准库中的排序算法
- 标准库:标准库中的排序算法
- 探讨c++标准模板库中的List
- C++标准模板库中的auto_ptr
- C++标准模板库中的auto_ptr
- C++标准模板库中的auto_ptr
- C++中的标准库模板STL
- 标准模板库中的队列实现例子
- C++:STL(标准模板库)
- C++_标准模板库(STL)
- linux把home多余的空间转到root中
- U盘安装Linux系统
- openlayer 简单实用
- Python 字符串格式化
- HDFS NameNode内存全景
- C++ 标准模板库中的排序
- 话说C语言const用法
- nodejs 下载网络文件 使用request
- 基于OkHttp3封装网络请求框架
- 欢迎使用CSDN-markdown编辑器
- UEditor编辑器的一些使用心得
- 和C++运算符重载相关的问题
- Spring Boot缓存实战 Caffeine
- 第七周实践项目2.3 顺序环形队列