sort函数中的第三个参数:自定义排序方式

sort排序规则

要理解为什么使用 std::abs(a) > std::abs(b) 进行排序会导致绝对值降序排列,我们需要深入理解排序算法的比较规则以及如何使用这些规则来实现特定的排序需求。

排序算法中的比较规则

std::sort 使用的是一种排序算法,它根据比较函数的返回值来决定元素的相对顺序。排序算法的核心是比较函数,它决定了两个元素的相对顺序。我们通常需要定义一个比较函数,这个函数接受两个参数,并返回一个布尔值。根据比较函数的返回值,算法决定元素的位置。

比较函数的基本规则

  • 比较函数通常具有如下签名:

    bool compare(T a, T b);
    

    其中,T 是容器中的元素类型。函数返回值决定了元素 ab 的排序顺序。

  • 排序标准

    • 如果 compare(a, b) 返回 true,则 a 会被放在 b 的前面。
    • 如果 compare(a, b) 返回 false,则 b 会被放在 a 的前面。

实现绝对值降序排列

为了实现绝对值降序排列,我们的目标是让绝对值大的元素排在前面。具体来说,就是:

  • 如果 std::abs(a) > std::abs(b),那么 a 应该排在 b 前面。
  • 如果 std::abs(a) < std::abs(b),那么 b 应该排在 a 前面。

为什么 std::abs(a) > std::abs(b) 实现了降序排列

比较函数返回值的影响

在排序过程中,我们传递给 std::sort 的比较函数应该满足以下规则:

  • 如果我们希望 ab 前面,我们需要让 compare(a, b) 返回 true
  • 如果我们希望 ba 前面,我们需要让 compare(a, b) 返回 false

对于绝对值降序排列,我们的比较函数应该实现这种逻辑:

  • std::abs(a) > std::abs(b) 时,a 应该在 b 前面,即我们希望 a 排在 b 前面。

代码示例

#include <iostream>
#include <vector>
#include <algorithm>  // 包含 sort 函数
#include <cmath>      // 包含 std::abs 函数

// 自定义比较函数
bool compareByAbsoluteValue(int a, int b) {
    // 按绝对值降序排序
    return std::abs(a) > std::abs(b);
}

int main() {
    std::vector<int> numbers = {4, -9, 2, -1, 5, -6};

    // 使用自定义比较函数进行排序
    std::sort(numbers.begin(), numbers.end(), compareByAbsoluteValue);

    // 输出排序后的 vector
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

解释

  1. 比较函数 compareByAbsoluteValue

    bool compareByAbsoluteValue(int a, int b) {
        return std::abs(a) > std::abs(b);
    }
    

    这个函数用于比较两个整数 ab 的绝对值。如果 std::abs(a) 大于 std::abs(b),函数返回 true,否则返回 false

  2. 排序过程

    • std::sort 使用这个比较函数来决定元素的顺序。
    • 如果 compareByAbsoluteValue(a, b) 返回 true,则 a 会被放在 b 前面。
    • 这样,绝对值大的元素会被放在前面,而绝对值小的元素会被放在后面,实现了绝对值降序排列。

总结

  • std::sort 依赖于比较函数的返回值来决定排序顺序。
  • 比较函数 compareByAbsoluteValue(int a, int b) 返回 true 时,表示 a 应该排在 b 前面。
  • 通过 std::abs(a) > std::abs(b) 实现绝对值降序排序,因为这个比较函数在绝对值大的元素与绝对值小的元素进行比较时,会让绝对值大的元素排在前面。

如果你有更多问题或需要进一步解释,请随时告诉我!

posted @ 2024-07-15 01:09  Tomorrowland_D  阅读(37)  评论(0编辑  收藏  举报