C++sort排序

sort使用方法

在 C++ 中,sort 函数是 <algorithm> 头文件中的一个功能强大的工具,用于对给定范围内的元素进行排序。以下是 sort 函数的基本用法:

#include <algorithm> // 包含 sort 函数的头文件
#include <vector>    // 如果使用 vector
// sort 函数原型:
// void sort(iterator first, iterator last, Compare comp);
// 对数组进行排序
void sortArrayExample() {
    int arr[] = {32, 71, 12, 45, 26, 80, 53, 33};
    int n = sizeof(arr) / sizeof(arr[0]);
    // 默认升序排序
    sort(arr, arr + n);
    // 打印排序后的数组
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}
// 对 vector 进行排序
void sortVectorExample() {
    vector<int> vec = {32, 71, 12, 45, 26, 80, 53, 33};
    // 默认升序排序
    sort(vec.begin(), vec.end());
    // 打印排序后的 vector
    for (int num : vec) {
        cout << num << " ";
    }
    cout << endl;
}
// 使用自定义比较函数进行降序排序
void sortDescendingExample() {
    int arr[] = {32, 71, 12, 45, 26, 80, 53, 33};
    int n = sizeof(arr) / sizeof(arr[0]);
    // 使用 greater<int> 作为比较函数进行降序排序
    sort(arr, arr + n, greater<int>());
    // 打印排序后的数组
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}
int main() {
    sortArrayExample();
    sortVectorExample();
    sortDescendingExample();
    return 0;
}

这里是如何使用 sort 函数的几个要点:

  1. sort 函数的第一个参数是迭代器,指向要排序的序列的第一个元素。
  2. 第二个参数是迭代器,指向要排序的序列的最后一个元素之后的元素(半开区间)。
  3. 第三个参数是可选的,是一个比较函数,用于定义排序的顺序。如果没有提供,默认使用 < 运算符,即升序排序。
  4. 如果要实现降序排序,可以使用 std::greater<T>() 或者自定义比较函数。
    在自定义比较函数时,它应该接受两个同类型的参数,并返回一个布尔值,指示第一个参数是否应该排在第二个参数之前。例如,为了实现降序排序,可以使用 std::greater<T>(),或者自定义一个比较函数如下:
// 自定义比较函数
bool customCompare(int a, int b) {
    return a > b; // 降序排序
}
// 使用自定义比较函数进行排序
sort(arr, arr + n, customCompare);

使用 sort 函数时,确保您已经包含了 <algorithm> 头文件。

内置比较函数

在 C++ 标准库中,除了 std::greater 之外,还有几个预定义的比较函数,它们都可以用作 sort 等算法的第三个参数。以下是一些常用的比较函数:

  1. std::less - 默认的比较函数,用于升序排序。
  2. std::greater - 用于降序排序。
  3. std::less_equal - 用于非严格升序排序(允许相等元素)。
  4. std::greater_equal - 用于非严格降序排序(允许相等元素)。
  5. std::equal_to - 用于排序,但保持元素的原始顺序(不进行排序)。
  6. std::not_equal_to - 用于排序,但保持元素的原始顺序(不进行排序)。
    以下是这些比较函数的示例用法:
#include <algorithm> // 包含 sort 函数和比较函数的头文件
#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec = {32, 71, 12, 45, 26, 80, 53, 33};
    // 使用 std::less 升序排序
    std::sort(vec.begin(), vec.end(), std::less<int>());
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << "\n"; // 输出排序后的结果
    // 使用 std::greater 降序排序
    std::sort(vec.begin(), vec.end(), std::greater<int>());
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << "\n"; // 输出排序后的结果
    // 使用 std::less_equal 非严格升序排序
    std::sort(vec.begin(), vec.end(), std::less_equal<int>());
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << "\n"; // 输出排序后的结果
    // 使用 std::greater_equal 非严格降序排序
    std::sort(vec.begin(), vec.end(), std::greater_equal<int>());
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << "\n"; // 输出排序后的结果
    // 使用 std::equal_to 和 std::not_equal_to 通常不用于排序,
    // 因为它们不改变元素的相对顺序。
    return 0;
}

通常,std::equal_tostd::not_equal_to 并不用于排序,因为它们不会改变元素的相对顺序。这些函数更多用于搜索算法(如 std::binary_search)或用于需要比较两个元素是否相等或不相等的情况。
除了使用标准库中的比较函数,你还可以定义自己的比较函数,以满足特定的排序需求。自定义比较函数应该接受两个参数,并返回一个布尔值,表示第一个参数是否应该排在第二个参数之前。例如:

bool customCompare(int a, int b) {
    // 根据特定条件排序,例如按照绝对值大小升序排序
    return abs(a) < abs(b);
}
std::sort(vec.begin(), vec.end(), customCompare);

如何自定义比较函数

在 C++ 中,你可以通过传递一个自定义的比较函数(或 lambda 表达式)给 std::sort 函数来自定义排序规则。这个比较函数需要接受两个同类型的参数,并返回一个布尔值,表示第一个参数是否应该排在第二个参数之前。
以下是自定义排序规则的几种方法:

使用函数指针

你可以定义一个普通的函数,然后传递它的指针给 std::sort

#include <algorithm> // 包含 std::sort
#include <vector>
#include <iostream>
// 自定义比较函数
bool customCompare(int a, int b) {
    return a > b; // 降序排序
}
int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9};
    // 使用自定义比较函数进行排序
    std::sort(vec.begin(), vec.end(), customCompare);
    // 输出排序后的向量
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

使用 lambda 表达式

在 C++11 及更高版本中,你可以使用 lambda 表达式来定义一个内联的比较函数。

#include <algorithm> // 包含 std::sort
#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9};
    // 使用 lambda 表达式进行降序排序
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a > b;
    });
    // 输出排序后的向量
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

使用函数对象(Functor)

你可以定义一个实现了 operator() 的类,即函数对象,然后传递它的实例给 std::sort

#include <algorithm> // 包含 std::sort
#include <vector>
#include <iostream>
// 自定义函数对象
struct CustomCompare {
    bool operator()(int a, int b) const {
        return a > b; // 降序排序
    }
};
int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9};
    // 使用函数对象进行排序
    std::sort(vec.begin(), vec.end(), CustomCompare());
    // 输出排序后的向量
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

以上任何一种方法都可以让你自定义排序规则,使得 std::sort 能够按照你指定的顺序排列元素。

### C++ STL `sort` 函数的用法和示例 #### 基本语法 `std::sort` 是 C++ 标准模板库中的一个重要算法,用于对容器内的元素进行排序。其基本形式如下: ```cpp template< class RandomIt > void sort( RandomIt first, RandomIt last ); ``` 此版本使用操作符 `<` 对范围 `[first, last)` 中的元素进行升序排列。 对于自定义比较器的情况,则可以采用以下签名: ```cpp template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); ``` 这里 `comp` 参数是一个二元谓词,它定义了严格弱顺序关系,并返回两个参数中较小者先出现的结果[^1]。 #### 示例代码 下面给出几个具体的例子来展示如何应用 `std::sort` 进行不同类型的数组或向量排序。 ##### 整数型数据排序 当处理简单的整数值时,可以直接调用无参版 `std::sort` 来完成工作。 ```cpp #include <iostream> #include <vector> #include <algorithm> int main(){ std::vector<int> numbers = {5, 3, 7, 9, 2}; // 使用默认的小于运算符 '<' 排序 std::sort(numbers.begin(), numbers.end()); for(auto num : numbers){ std::cout << num << ' '; } } // 输出: 2 3 5 7 9 ``` ##### 自定义对象排序 如果要按照特定属性对复杂结构体或者类实例进行排序,则需提供额外的比较逻辑给第三个参数——即比较函数。 假设有一个表示学生的简单结构体及其成绩字段作为排序依据: ```cpp struct Student { std::string name; double grade; bool operator<(const Student& other)const{ return grade < other.grade; } }; bool compareByGrade(const Student& lhs, const Student& rhs){ return lhs.grade < rhs.grade; } int main(){ std::vector<Student> students = { {"Alice", 88}, {"Bob", 92}, {"Charlie", 85} }; // 方法一:通过重载成员运算符 '<' std::sort(students.begin(), students.end()); // 或者方法二:传递外部比较函数 std::sort(students.begin(), students.end(), compareByGrade); for(auto student : students){ std::cout << student.name << ": " << student.grade << '\n'; } /* * 输出: * Charlie: 85 * Alice: 88 * Bob: 92 */ } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qhumaing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值