数据结构与算法(基于<algorithm>)

algorithm算法库

  • 一.排序算法(sort、stable_sort、partial_sort、nth_element)
    • 1.代码示例
    • 2.运行结果
  • 二.查找算法(find、find_if、count、binary_search)
    • 1.代码示例
    • 2.运行结果
  • 三.变动算法(reverse、rotate、copy、remove)
    • 1.代码示例
    • 2.运行结果
  • 四.数值算法(accumulate、inner_product、adjacent_difference、iota)需包含numeric库
    • 1.代码示例
    • 2.运行结果
  • 五.其他算法(for_each、unique、max/min、next_permutation/prev_permutation)
    • 1.代码示例
    • 2.运行结果

C++的algorithm库是STL标准库的一部分,提供了许多常用的算法函数,包括排序、查找、遍历等等。这些函数可以大大简化C++操作数据结构的程序的编写过程,同时也具有高效和可靠的特性。

以下是algorithm库中一些常用的函数:

一.排序算法(sort、stable_sort、partial_sort、nth_element)

  1. sort:对一个区间进行排序
  2. stable_sort:对一个区间进行稳定排序
  3. partial_sort:对一个区间的前n个元素进行排序
  4. nth_element:对一个区间进行部分排序,保证第n个元素在排序后的正确位置上

1.代码示例

#include 
#include 
#include 

using namespace std;

bool cmp(string s1, string s2) {
    return s1.length() < s2.length();
}

int main() {
    // sort函数排序
    vector<int> nums1 = { 4, 2, 8, 1, 6, 5, 7, 3 };
    sort(nums1.begin(), nums1.end());
    cout << "sort函数排序结果:";
    for (auto num : nums1) {
        cout << num << " ";
    }
    cout << endl;

    // stable_sort函数稳定排序
    vector<string> strs = { "bbb", "aa", "cccc", "dd" };
    stable_sort(strs.begin(), strs.end(), cmp);
    cout << "stable_sort函数排序结果:";
    for (auto str : strs) {
        cout << str << " ";
    }
    cout << endl;

    // partial_sort函数部分排序
    vector<int> nums2 = { 4, 2, 8, 1, 6, 5, 7, 3 };
    partial_sort(nums2.begin(), nums2.begin() + 3, nums2.end());
    cout << "partial_sort函数排序结果:";
    for (auto num : nums2) {
        cout << num << " ";
    }
    cout << endl;

    // nth_element函数部分排序
    vector<int> nums3 = { 4, 2, 8, 1, 6, 5, 7, 3 };
    nth_element(nums3.begin(), nums3.begin() + 5, nums3.end());
    cout << "nth_element函数排序结果:";
    for (auto num : nums3) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

2.运行结果

在这里插入图片描述

二.查找算法(find、find_if、count、binary_search)

  1. find:在一个区间中查找一个元素
  2. find_if:在一个区间中查找符合条件的第一个元素
  3. count:统计一个区间中某个元素的个数
  4. binary_search:在一个有序区间中查找一个元素

1.代码示例

#include 
#include 
#include 

using namespace std;

int main() {
    vector<int> nums = {5, 2, 8, 4, 1, 9, 3, 6, 7}; // 待查找的向量

    int target = 4; // 目标元素

    // 使用find函数查找目标元素
    auto it = find(nums.begin(), nums.end(), target);

    if (it != nums.end()) {
        cout << "找到了目标元素,其下标为:" << it - nums.begin() << endl;
    } else {
        cout << "未找到目标元素" << endl;
    }

    // 使用find_if函数查找符合条件的第一个元素
    auto it2 = find_if(nums.begin(), nums.end(), [](int x){ return x % 2 == 0; });

    if (it2 != nums.end()) {
        cout << "找到了符合条件的第一个元素,其值为:" << *it2 << endl;
    } else {
        cout << "未找到符合条件的元素" << endl;
    }

    // 使用count函数统计某个元素出现的次数
    int countt = count(nums.begin(), nums.end(), target);
    cout << "目标元素出现的次数为:" << countt << endl;

    // 使用binary_search函数在有序区间中查找目标元素
    sort(nums.begin(), nums.end()); // 先对向量进行排序
    bool found = binary_search(nums.begin(), nums.end(), target);

    if (found) {
        cout << "在有序区间中找到了目标元素" << endl;
    } else {
        cout << "在有序区间中未找到目标元素" << endl;
    }

    return 0;
}

2.运行结果

数据结构与算法(基于<algorithm>)_第1张图片

三.变动算法(reverse、rotate、copy、remove)

  1. reverse:反转一个区间
  2. rotate:旋转一个区间
  3. copy:将一个区间复制到另一个区间中
  4. remove:将一个区间中符合条件的元素移除

1.代码示例

#include 
#include 
#include 

using namespace std;

int main() {
    // reverse函数反转一个区间
    vector<int> nums1 = { 1, 2, 3, 4, 5 };
    reverse(nums1.begin(), nums1.end());
    cout << "reverse函数反转结果:";
    for (auto num : nums1) {
        cout << num << " ";
    }
    cout << endl;

    // rotate函数旋转一个区间
    vector<int> nums2 = { 1, 2, 3, 4, 5 };
    rotate(nums2.begin(), nums2.begin() + 2, nums2.end());
    cout << "rotate函数旋转结果:";
    for (auto num : nums2) {
        cout << num << " ";
    }
    cout << endl;

    // copy函数将一个区间复制到另一个区间中
    vector<int> nums3 = { 1, 2, 3, 4, 5 };
    vector<int> nums4(nums3.size());
    copy(nums3.begin(), nums3.end(), nums4.begin());
    cout << "copy函数复制结果:";
    for (auto num : nums4) {
        cout << num << " ";
    }
    cout << endl;

    // remove函数将一个区间中符合条件的元素移除
    vector<int> nums5 = { 1, 2, 3, 4, 5 };
    int val = 3;
    auto it = remove(nums5.begin(), nums5.end(), val);
    nums5.erase(it, nums5.end());
    cout << "remove函数移除结果:";
    for (auto num : nums5) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

2.运行结果

数据结构与算法(基于<algorithm>)_第2张图片

四.数值算法(accumulate、inner_product、adjacent_difference、iota)需包含numeric库

  1. accumulate:计算一个区间内所有元素的和
  2. inner_product:计算两个区间内对应元素的乘积和的和
  3. adjacent_difference:计算一个区间内相邻元素的差
  4. iota:从一个值开始,生成一个连续的区间

1.代码示例

#include 
#include 
#include   // 包含 accumulate、inner_product、adjacent_difference、iota 函数

using namespace std;

int main() {
    // accumulate函数计算一个区间内所有元素的和
    vector<int> nums1 = { 1, 2, 3, 4, 5 };
    int sum = accumulate(nums1.begin(), nums1.end(), 0);
    cout << "accumulate函数计算结果:" << sum << endl;

    // inner_product函数计算两个区间内对应元素的乘积和的和
    vector<int> nums2 = { 1, 2, 3, 4, 5 };
    vector<int> nums3 = { 2, 3, 4, 5, 6 };
    int res = inner_product(nums2.begin(), nums2.end(), nums3.begin(), 0);
    cout << "inner_product函数计算结果:" << res << endl;

    // adjacent_difference函数计算一个区间内相邻元素的差
    vector<int> nums4 = { 1, 2, 6, 4, 5 };
    vector<int> diff(nums4.size());
    adjacent_difference(nums4.begin(), nums4.end(), diff.begin());
    cout << "adjacent_difference函数计算结果:";
    for (auto num : diff) {
        cout << num << " ";
    }
    cout << endl;

    // iota函数从一个值开始,生成一个连续的区间
    vector<int> nums5(5);
    iota(nums5.begin(), nums5.end(), 1);
    cout << "iota函数生成结果:";
    for (auto num : nums5) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

2.运行结果

数据结构与算法(基于<algorithm>)_第3张图片

五.其他算法(for_each、unique、max/min、next_permutation/prev_permutation)

  1. for_each:对一个区间内的每个元素执行一个函数
  2. unique:移除一个区间中相邻的重复元素
  3. max、min:求出一个区间内的最大、最小元素
  4. next_permutation、prev_permutation:求出一个区间内的下一个/上一个排列

1.代码示例

#include 
#include 
#include 

using namespace std;

// for_each:对一个区间内的每个元素执行一个函数
void print(int x) {
    cout << x << " ";
}

void test_for_each() {
    vector<int> nums = { 1, 2, 3, 4, 5 };
    cout << "原始序列:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;

    cout << "使用for_each函数输出每个元素:";
    for_each(nums.begin(), nums.end(), [](int x) {cout << x << " "; });
    cout << endl;
}

// unique:移除一个区间中相邻的重复元素
void test_unique() {
    vector<int> nums = { 1, 1, 2, 2, 3, 4, 4, 5 };
    cout << "原始序列:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;

    auto new_end = unique(nums.begin(), nums.end());
    cout << "移除重复元素后的序列:";
    for_each(nums.begin(), new_end, print);
    cout << endl;
}

// max、min:求出一个区间内的最大、最小元素
void test_max_min() {
    vector<int> nums = { 1, 2, 3, 4, 5 };
    cout << "原始序列:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;

    cout << "最大值为:" << *max_element(nums.begin(), nums.end()) << endl;
    cout << "最小值为:" << *min_element(nums.begin(), nums.end()) << endl;
}

// next_permutation、prev_permutation:求出一个区间内的下一个/上一个排列
void test_permutation() {
    vector<int> nums = { 1, 2, 3 };
    cout << "原始序列:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;

    // 求出下一个排列
    next_permutation(nums.begin(), nums.end());
    cout << "下一个排列为:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;

    // 求出上一个排列
    prev_permutation(nums.begin(), nums.end());
    cout << "上一个排列为:";
    for_each(nums.begin(), nums.end(), print);
    cout << endl;
}

int main() {
    test_for_each();
    test_unique();
    test_max_min();
    test_permutation();
    return 0;
}

2.运行结果

数据结构与算法(基于<algorithm>)_第4张图片

需要注意的是,以上仅列举了部分常用的函数,algorithm库中还有许多其他函数。在实际使用时,可以根据具体的需求来选择合适的函数,并结合其他STL容器、迭代器等工具来完成具体的任务。

你可能感兴趣的:(数据结构,算法,c++,数据结构)