1、排序算法
(1)对所有元素排序sort(), stable_sort()
#include "algostuff.hpp"
using namespace std;
int main() {
deque<int> coll;
INSERT_ELEMENTS(coll, 1, 9);
INSERT_ELEMENTS(coll, 1, 9);
PRINT_ELEMENTS(coll, "on entry: ");
sort(coll.begin(), coll.end());
PRINT_ELEMENTS(coll, "sorted: ");
sort(coll.begin(), coll.end(), greater<int>());
PRINT_ELEMENTS(coll, "storted > ");
return 0;
}
输出:
on entry: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
sorted: 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
storted > 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
#include "algostuff.hpp"
using namespace std;
bool lessLength(const string& s1, const string& s2) {
return s1.length() < s2.length();
}
int main() {
vector<string> coll1 = {"1xxxx", "2x", "3x", "4x", "5xx", "6xxxx", "7xx", "8xxx", "9xx", "10xxx","11", "12", "13", "14xx", "15","16","17"};
vector<string> coll2(coll1);
PRINT_ELEMENTS(coll1, "on entry: ");
sort(coll1.begin(), coll1.end(), lessLength);
stable_sort(coll2.begin(), coll2.end(), lessLength);
PRINT_ELEMENTS(coll1, "with sort(): \n");
PRINT_ELEMENTS(coll2, "with stable_sort(): \n");
return 0;
}
输出:
on entry: 1xxxx 2x 3x 4x 5xx 6xxxx 7xx 8xxx 9xx 10xxx 11 12 13 14xx 15 16 17
with sort():
2x 17 16 15 13 12 11 4x 3x 9xx 7xx 5xx 8xxx 14xx 10xxx 6xxxx 1xxxx
with stable_sort():
2x 3x 4x 11 12 13 15 16 17 5xx 7xx 9xx 8xxx 14xx 1xxxx 6xxxx 10xxx
(2)局部排序partial_sort(), partial_sort()
#include "algostuff.hpp"
using namespace std;
int main() {
deque<int> coll;
INSERT_ELEMENTS(coll, 3, 7);
INSERT_ELEMENTS(coll, 2, 6);
INSERT_ELEMENTS(coll, 1, 5);
PRINT_ELEMENTS(coll);
partial_sort(coll.begin(), coll.begin()+5,
coll.end());
PRINT_ELEMENTS(coll);
partial_sort(coll.begin(), coll.begin()+5,
coll.end(),
greater<int>());
PRINT_ELEMENTS(coll);
partial_sort(coll.begin(), coll.end(),
coll.end());
PRINT_ELEMENTS(coll);
return 0;
}
输出:
3 4 5 6 7 2 3 4 5 6 1 2 3 4 5
1 2 2 3 3 7 6 5 5 6 4 4 3 4 5
7 6 6 5 5 1 2 2 3 3 4 4 3 4 5
1 2 2 3 3 3 4 4 4 5 5 5 6 6 7
(3)partial_sort_copy()
#include "algostuff.hpp"
using namespace std;
int main() {
deque<int> coll1;
vector<int> coll6(6);
vector<int> coll30(30);
INSERT_ELEMENTS(coll1, 3, 7);
INSERT_ELEMENTS(coll1, 2, 6);
INSERT_ELEMENTS(coll1, 1, 5);
PRINT_ELEMENTS(coll1);
vector<int>::const_iterator pos6;
pos6 = partial_sort_copy(coll1.cbegin(), coll1.cend(),
coll6.begin(), coll6.end());
copy(coll6.cbegin(), pos6,
ostream_iterator<int>(cout, " "));
cout << endl;
vector<int>::const_iterator pos30;
pos30 = partial_sort_copy(coll1.cbegin(), coll1.cend(),
coll30.begin(), coll30.end(),
greater<int>());
copy(coll30.cbegin(), pos30,
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
输出:
3 4 5 6 7 2 3 4 5 6 1 2 3 4 5
1 2 2 3 3 3
7 6 6 5 5 5 4 4 4 3 3 3 2 2 1
(4)根据第n个元素排序nth_element()
#include "algostuff.hpp"
using namespace std;
int main() {
deque<int> coll;
INSERT_ELEMENTS(coll, 3, 7);
INSERT_ELEMENTS(coll, 2, 6);
INSERT_ELEMENTS(coll, 1, 5);
PRINT_ELEMENTS(coll);
nth_element(coll.begin(), coll.begin()+3, coll.end());
cout << "the four lowest elements are: ";
copy(coll.cbegin(), coll.cbegin()+4, ostream_iterator<int>(cout, " "));
cout << endl;
nth_element(coll.begin(), coll.end()-4, coll.end());
cout << "the four highest elements are: ";
copy(coll.cend()-4, coll.cend(), ostream_iterator<int>(cout, " "));
cout << endl;
nth_element(coll.begin(), coll.begin()+3,
coll.end(), greater<int>());
cout << "the four highest elements are: ";
copy(coll.cbegin(), coll.cbegin()+4,
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
输出:
3 4 5 6 7 2 3 4 5 6 1 2 3 4 5
the four lowest elements are: 2 1 2 3
the four highest elements are: 5 6 6 7
the four highest elements are: 6 7 6 5
(5)make_heap()、push_heap()、pop_heap()、sort_heap()
#include "algostuff.hpp"
using namespace std;
int main() {
vector<int> coll;
INSERT_ELEMENTS(coll, 3, 7);
INSERT_ELEMENTS(coll, 5, 9);
INSERT_ELEMENTS(coll, 1, 4);
PRINT_ELEMENTS(coll, "on entry: ");
make_heap(coll.begin(), coll.end());
PRINT_ELEMENTS(coll, "after make_heap(): ");
pop_heap(coll.begin(), coll.end());
coll.pop_back();
PRINT_ELEMENTS(coll, "after pop_heap(): ");
coll.push_back(17);
push_heap(coll.begin(), coll.end());
PRINT_ELEMENTS(coll, "after push_heap(): ");
sort_heap(coll.begin(), coll.end());
PRINT_ELEMENTS(coll, "after sort_heap(): ");
return 0;
}
输出:
on entry: 3 4 5 6 7 5 6 7 8 9 1 2 3 4
after make_heap(): 9 8 6 7 7 5 5 3 6 4 1 2 3 4
after pop_heap(): 8 7 6 7 4 5 5 3 6 4 1 2 3
after push_heap(): 17 7 8 7 4 5 6 3 6 4 1 2 3 5
after sort_heap(): 1 2 3 3 4 4 5 5 6 6 7 7 8 17
调用make_heap之后,元素被排序为9 8 6 7 7 5 5 3 6 4 1 2 3 4
转换为二叉树如下:
2、已排序区间算法
(1)binary_search()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll;
INSERT_ELEMENTS(coll, 1, 9);
PRINT_ELEMENTS(coll);
if(binary_search(coll.begin(), coll.end(), 5)) {
cout << "5 is present" << endl;
} else {
cout << "5 is not present" << endl;
}
if(binary_search(coll.begin(), coll.end(), 42)) {
cout << "42 is present" << endl;
} else {
cout << "42 is not present" << endl;
}
return 0;
}
输出:
1 2 3 4 5 6 7 8 9
5 is present
42 is not present
(2)检查数个元素是否存在includes()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll;
vector<int> search;
INSERT_ELEMENTS(coll, 1, 9);
PRINT_ELEMENTS(coll, "coll: ");
search.push_back(3);
search.push_back(4);
search.push_back(7);
PRINT_ELEMENTS(search, "search: ");
if(includes(coll.cbegin(), coll.cend(),
search.cbegin(), search.cend())) {
cout << "all elements of search are also in coll" << endl;
} else {
cout << "not all elements of search are also in coll" << endl;
}
return 0;
}
输出:
coll: 1 2 3 4 5 6 7 8 9
search: 3 4 7
all elements of search are also in coll
(3)查找第一个或者最后一个可能的位置lower_bound()、upper_bound()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll;
INSERT_ELEMENTS(coll, 1, 9);
INSERT_ELEMENTS(coll, 1, 9);
coll.sort();
PRINT_ELEMENTS(coll);
auto pos1 = lower_bound(coll.cbegin(), coll.cend(), 5);
auto pos2 = upper_bound(coll.cbegin(), coll.cend(), 5);
cout << "5 could get position "
<< distance(coll.cbegin(), pos1) + 1
<< " up to "
<< distance(coll.cbegin(), pos2) + 1
<< " without breaking the sorting" << endl;
coll.insert(lower_bound(coll.begin(), coll.end(), 3), 3);
coll.insert(upper_bound(coll.begin(), coll.end(), 7), 7);
PRINT_ELEMENTS(coll);
return 0;
}
输出:
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
5 could get position 9 up to 11 without breaking the sorting
1 1 2 2 3 3 3 4 4 5 5 6 6 7 7 7 8 8 9 9
(4)查找第一个和最后一个可能位置equal_range()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll;
INSERT_ELEMENTS(coll, 1, 9);
INSERT_ELEMENTS(coll, 1, 9);
coll.sort();
PRINT_ELEMENTS(coll);
pair<list<int>::const_iterator, list<int>::const_iterator> range;
range = equal_range(coll.cbegin(), coll.cend(), 5);
cout << "5 could get position "
<< distance(coll.cbegin(), range.first) + 1
<< " up to "
<< distance(coll.cbegin(), range.second) + 1
<< " without breaking the sorting" << endl;
return 0;
}
输出:
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
5 could get position 9 up to 11 without breaking the sorting
(5)合并元素merge()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll1;
set<int> coll2;
INSERT_ELEMENTS(coll1, 1, 6);
INSERT_ELEMENTS(coll2, 3, 8);
PRINT_ELEMENTS(coll1, "coll1: ");
PRINT_ELEMENTS(coll2, "coll2: ");
cout << "merged: ";
merge(coll1.cbegin(), coll1.cend(),
coll2.cbegin(), coll2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
输出:
coll1: 1 2 3 4 5 6
coll2: 3 4 5 6 7 8
merged: 1 2 3 3 4 4 5 5 6 6 7 8
(6)两个已排序集合的并集set_union(),set_intersection(),set_difference(), set_symmetric_difference()
#include "algostuff.hpp"
using namespace std;
int main() {
vector<int> c1 = {1, 2, 2, 4, 6, 7, 7, 9};
deque<int> c2 = {2, 2, 2, 3, 6, 6, 8, 9};
cout << "c1: ";
copy(c1.cbegin(), c1.cend(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "c2: ";
copy(c2.cbegin(), c2.cend(), ostream_iterator<int>(cout, " "));
cout << endl << endl;
cout << "merged: ";
merge(c1.cbegin(), c1.cend(),
c2.cbegin(), c2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
cout << "set_union: ";
set_union(c1.cbegin(), c1.cend(),
c2.cbegin(), c2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
cout << "set_intersection()";
set_intersection(c1.cbegin(), c1.cend(),
c2.cbegin(), c2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
cout << "set_difference()";
set_difference(c1.cbegin(), c1.cend(),
c2.cbegin(), c2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
cout << "set_symmetric_difference(): ";
set_symmetric_difference(c1.cbegin(), c1.cend(),
c2.cbegin(), c2.cend(),
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
输出:
c1: 1 2 2 4 6 7 7 9
c2: 2 2 2 3 6 6 8 9
merged: 1 2 2 2 2 2 3 4 6 6 6 7 7 8 9 9
set_union: 1 2 2 2 3 4 6 6 7 7 8 9
set_intersection()2 2 6 9
set_difference()1 4 7 7
set_symmetric_difference(): 1 2 3 4 6 7 7 8
(7)合并连贯之已排序区间inplace_merge()
#include "algostuff.hpp"
using namespace std;
int main() {
list<int> coll;
INSERT_ELEMENTS(coll, 1, 7);
INSERT_ELEMENTS(coll, 1, 8);
PRINT_ELEMENTS(coll);
list<int>::iterator pos;
pos = find(coll.begin(), coll.end(), 7);
++pos;
inplace_merge(coll.begin(), pos, coll.end());
PRINT_ELEMENTS(coll);
return 0;
}
输出:
1 2 3 4 5 6 7 1 2 3 4 5 6 7 8
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8