algorithm 排序操作

排序算法

排序算法的特点是对容器的内容进行不同方式的排序,例如 Sort()。

函数 算法
binary_search(first, last, val) 二元搜索
equal_range(first, last, val) 判断是否相等,并返回一个区间
includes(first, last, first2, last2) 包含与
lexicographical_compare(first, last, first2, last2) 以字典排序方式做比较
lower_bound(first, last, val) 下限
make_heap(first, last) 制造一个 heap
max(val1, val2) 最大值
max_element(first, last) 最大值所在位置
merge(first, last, first2, last2, result) 合并两个序列
min(val1, val2) 最小值
min_element(first, last) 最小值所在位置
next_permutation(first, last) 获得下一个排列组合
nth_element(first, nth, last) 重新排序列中第 n 个元素的左右两端
partial_sort_copy(first, last, first2, last2) 局部排序并复制到其他位置
partial_sort(first, middle, last) 局部排序
pop_heap(first, last) 从 heap 内取出一个元素
prev_permutation(first, last) 改变迭代器 first 和 last 指明范围内的元素排序,使新排列是下一个比原排列小的排列,此函数的另一个版本以谓词作为第 3 个实参
push_heap(first, last) 将一个元素压入 heap
set_difference(first, last, first2, last2, result) 获得前一个排列组合
set_intersection(first, last, first2, last2, result) 交集
set_symmetric_difference(first, last, first2, last2, result) 差集
set_union(first, last, first2, last2, result) 联集
sort(first, last) 排序
sort_heap(first, last) 对 heap 排序
stable_sort(first, last) 排序并保持等值元素的相对次序
upper_bound(first, last, val) 上限


sort(first, last)

对迭代器 first 和 last 指明范围内的元素排序。此函数的另一个版本以谓词作为第 3 个参数。

#include 
#include 
#include 

using namespace std;

void Test_sort()
{
    vector int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);
    random_shuffle(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    sort(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:8 1 9 2 0 5 7 3 4 6
Vector:0 1 2 3 4 5 6 7 8 9


partial_sort(first, middle, last)

对迭代器 first 和 last 指明范围内的元素进行排序,把排序后的前一部分元素放至序列的前一部分(由 first 和 middle 指明的范围),其余元素放在后一部分(由 middle 和 last 指明的范围)。此函数的另一版本以谓词作为第 4 个实参。

#include 
#include 
#include 

using namespace std;

void Test_partial_sort()
{
    vector int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(i);
    random_shuffle(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    // 只替换排序后前5个元素
    partial_sort(int_vector.begin(), int_vector.begin() + 5, int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:8 1 9 2 0 5 7 3 4 6
Vector:0 1 2 3 4 9 8 7 5 6


nth_element(first, nth, last)

在迭代器 first 和 last 指明范围的已排序元素中查找 val。如果找到值为 val 的元素,返回 true, 否则返回 false 值。此函数的另一个版本以谓词作为第 4 个实参。

#include 
#include 
#include 

using namespace std;

void Test_nth_element()
{
    vector int_vector;
    for (size_t i = 0; i < 50; i++) int_vector.push_back(i);
    random_shuffle(int_vector.begin(), int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    nth_element(int_vector.begin(), int_vector.begin() + 5, int_vector.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
}
Output
Vector:34 49 17 26 21 44 35 32 20 33 41 19 48 45 3 5 6 22 14 13 23 29 39 28 46 8 2 10 25 36 4 38 27 9 7 40 1 31 47 18 11 37 24 30 0 15 12 16 42 43
Vector:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 41 33 32 40 44 49 47 34 46 37 39 35 45 36 48 38 42 43


merge(first, last, first2, last2, result)

把从 first 到 last 指明范围内的已排序元素与 first2 和 last2 指明范围内的已排序元素合并,并把重新排序后的元素放在从 result 开始的序列中。此函数的另一版本以谓词作为第 6 个实参。

#include 
#include 
#include 

using namespace std;

void Test_merge()
{
    vector int_vector;
    for (size_t i = 0; i < 10; i++) int_vector.push_back(rand());
    sort(int_vector.begin(), int_vector.end());
    vector int_vector2;
    for (size_t i = 0; i < 10; i++) int_vector2.push_back(rand());
    sort(int_vector2.begin(), int_vector2.end());

    cout << "Vector1:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;
    cout << "Vector2:";
    for (int item : int_vector2) cout << item << ' ';
    cout << endl;

    vector result(int_vector.size() + int_vector2.size());
    // 合并必须是排序后的序列
    merge(int_vector.begin(), int_vector.end(), int_vector2.begin(), int_vector2.end(), result.begin());

    cout << "Vector3:";
    for (int item : result) cout << item << ' ';
    cout << endl;
}
Output
Vector1:41 6334 11478 15724 18467 19169 24464 26500 26962 29358
Vector2:491 2995 4827 5436 5705 9961 11942 16827 23281 28145
Vector3:41 491 2995 4827 5436 5705 6334 9961 11478 11942 15724 16827 18467 19169 23281 24464 26500 26962 28145 29358


includes(first, last, first2, last2)

在迭代器 first 和 last 指明的范围内,如果含有一个用 first2 和 last2 指明范围的已排序序列,则返回 true 值。此函数的另一个版本以谓词作为第 5 个实参。

#include 
#include 
#include 

using namespace std;

void Test_includes()
{
    vector int_vector{ 2,5,12,1,53,13,23,21,3,6,7,8,8 };
    sort(int_vector.begin(), int_vector.end());

    vector int_vector2{ 8,6,7,8 };
    sort(int_vector2.begin(), int_vector2.end());

    cout << "Vector:";
    for (int item : int_vector) cout << item << ' ';
    cout << endl;

    cout << "是否包含:[6,7,8,8]" << endl;

    // 必须是排序后的序列
    bool is_includes = includes(int_vector.begin(), int_vector.end(), int_vector2.begin(), int_vector2.end());
    cout << "结果:" << (is_includes ? "包含" : "不包含");
}
Output
Vector:1 2 3 5 6 7 8 8 12 13 21 23 53
是否包含:[6,7,8,8]
结果:包含


相关参考

微软文档

cppreference

你可能感兴趣的:(algorithm 排序操作)