sort函数svip讲解并举例说明

本文详细介绍了C++中sort函数的三种排序方式:1) 使用默认升序排序;2) 自定义比较函数实现升序和降序排序;3) 结合结构体重载运算符或自定义函数对象进行排序。通过实例展示了如何根据需求灵活运用sort函数进行排序操作。

sort函数排序的三种方式使用

1.自带库函数(用的少) 默认从小到大

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

void printArr(int a[],int n)
{
    for(int i = 0 ;i < n;i++)
        cout << a[i] << " ";
    cout << endl;
}
int main()
{
    int a[10] = {9,6,3,4,8,5,2,7,1,0};
    sort(a,a+10);
    printArr(a,10);
    sort(a,a+10,less<int>());
    printArr(a,10);
    sort(a,a+10,greater<int>());
    printArr(a,10);
    return 0;
}

输出结果:
在这里插入图片描述

2.自定义比较函数(重点)

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

bool cmp1(int a, int b) {return a < b;}
bool cmp2(int a, int b) {return a > b;}

void printArr(int a[],int n)
{
    for(int i = 0 ;i < n;i++)
        cout << a[i] << " ";
    cout << endl;
}
int main()
{
    int a[10] = {9,6,3,4,8,5,2,7,1,0};
    sort(a,a+10);
    printArr(a,10);
    sort(a,a+10,cmp1);
    printArr(a,10);
    sort(a,a+10,cmp2);
    printArr(a,10);
    return 0;
}

输出结果如下:
在这里插入图片描述

3.配合结构体使用的比较函数(超重点)

== 方式一. 重载小于号 ==
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

struct student
{
    int math, english;
    bool operator< (const student &b)
    {
        if(math == b.math)
            return english < b.english;
        else
            return math < b.math;
    }
};
student st[100];

int main()
{
    for (int i = 0; i < 7; i++)
        cin >> st[i].math >> st[i].english;
    //按数学成绩从小到大,如果相同,按语文成绩从小到大
    sort(st, st + 7);
    for (int i = 0; i < 7; i++)
        printf("math = %d, english = %d \n", \
        st[i].math, st[i].english);
    return 0;
}

输出结果:
在这里插入图片描述

== 方式二. 直接写函数比较 ==
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

struct student
{
    int math, english;
};
student st[100];

bool cmp(const student &a, const student &b)
{
    if (a.math == b.math)
        return a.english < b.english;
    else
        return a.math < b.math;
}
int main()
{
    for (int i = 0; i < 7; i++)
        cin >> st[i].math >> st[i].english;
    //按数学成绩从小到大,如果相同,按语文成绩从小到大
    sort(st, st + 7,cmp);
    for (int i = 0; i < 7; i++)
        printf("math = %d, english = %d \n",
               st[i].math, st[i].english);
    return 0;
}

输出结果:
在这里插入图片描述

== 方式3. 重载括号、仿函数、用自定义函数对象排序 ==
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

struct student
{
    int math, english;
};
student st[100];
struct
{
    bool operator()(const student &a, const student &b)
    {
        if (a.math == b.math)
            return a.english < b.english;
        else
            return a.math < b.math;
    }
}cmp;
main()
{
    for (int i = 0; i < 7; i++)
        cin >> st[i].math >> st[i].english;
    //按数学成绩从小到大,如果相同,按语文成绩从小到大
    sort(st, st + 7, cmp);
    for (int i = 0; i < 7; i++)
        printf("math = %d, english = %d \n",
               st[i].math, st[i].english);
    return 0;
}

输出结果
在这里插入图片描述

<think>我们首先需要解释什么是回调函数,然后通过一个简单的例子来说明。 回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 通俗地说:回调函数就像是你给别人的一个电话号码,当对方有事情的时候就会打这个电话通知你。 举例:假设我们有一个排序函数,它可以对任何类型的数组进行排序,但是排序时需要比较两个元素的大小。由于不同的数据类型比较方式不同,我们可以让用户自己定义一个比较函数,然后将这个函数的指针传给排序函数。在排序过程中,排序函数会调用用户传入的比较函数来决定两个元素的顺序。 下面我们用C语言写一个例子: 我们实现一个冒泡排序函数,它可以对整数数组排序,但是排序的规则(升序或降序)由用户传入的回调函数决定。 步骤: 1. 定义一个函数指针类型,用于比较两个整数。 2. 实现冒泡排序函数,它接收一个整数数组、数组长度和一个比较函数的指针。 3. 在冒泡排序中,使用传入的比较函数来比较相邻的两个元素,以决定是否交换它们。 4. 用户定义两个比较函数:升序和降序。 5. 主函数中,分别用升序和降序的方式对数组进行排序打印。 代码示例: ```c #include <stdio.h> // 定义函数指针类型,用于比较两个整数 typedef int (*CompareFunc)(int, int); // 冒泡排序函数,使用回调函数进行比较 void bubble_sort(int arr[], int n, CompareFunc comp) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { // 使用回调函数比较相邻元素 if (comp(arr[j], arr[j+1])) { // 交换 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } // 升序比较:如果第一个数大于第二个数,则交换(即返回1表示需要交换,这样大的数就会往后移,最终达到升序) int ascending(int a, int b) { return a > b; } // 降序比较:如果第一个数小于第二个数,则交换(这样小的数就会往后移,最终达到降序) int descending(int a, int b) { return a < b; } // 打印数组 void print_array(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); printf("原始数组: "); print_array(arr, n); // 使用升序排序 bubble_sort(arr, n, ascending); printf("升序排序后: "); print_array(arr, n); // 重新初始化数组,因为上面已经排序过了 int arr2[] = {64, 34, 25, 12, 22, 11, 90}; n = sizeof(arr2)/sizeof(arr2[0]); // 使用降序排序 bubble_sort(arr2, n, descending); printf("降序排序后: "); print_array(arr2, n); return 0; } ``` 运行结果: 原始数组: 64 34 25 12 22 11 90 升序排序后: 11 12 22 25 34 64 90 降序排序后: 90 64 34 25 22 12 11 在这个例子中,bubble_sort函数是通用的排序函数,它通过回调函数comp来决定排序的规则。用户可以根据需要传入ascending或descending函数,从而实现不同的排序方式。 这就是回调函数的一个典型应用:将函数作为参数传递,使得函数更加灵活和可复用。 §§相关问题§§ 1. 回调函数在C语言中除了排序比较,还有哪些常见的应用场景? 2. 如何实现一个回调函数来处理不同的事件(例如事件驱动编程)? 3. 在C语言中,函数指针和普通指针有什么区别? 4. 回调函数在异步编程中是如何使用的? 5. 使用回调函数时需要注意哪些问题(比如内存安全、函数生命周期)?</think>### 通俗易懂讲解C语言回调函数(附示例) **回调函数本质**: 就像点外卖——你下单后(调用函数),把手机号留给商家(注册回调函数)。当外卖做好(事件发生),商家**回拨**你(执行回调函数)。核心是**"你定义函数,别人在特定时机调用"**。 #### 示例场景:计算器程序 假设我们要写一个计算器,能执行加、减、乘、除操作,但不想把每个运算都写死在主逻辑里。 ```c #include <stdio.h> // 1. 定义回调函数类型(函数指针) typedef int (*Operation)(int, int); // 2. 用户自定义的回调函数(加、减、乘) int Add(int a, int b) { return a + b; } int Subtract(int a, int b) { return a - b; } int Multiply(int a, int b) { return a * b; } // 3. 核心函数(接收回调函数作为参数) void Calculator(int x, int y, Operation op) { int result = op(x, y); // 在需要时执行回调 printf("结果: %d\n", result); } int main() { // 4. 传递不同回调函数实现不同功能 Calculator(10, 5, Add); // 输出:15 Calculator(10, 5, Subtract); // 输出:5 Calculator(10, 5, Multiply); // 输出:50 return 0; } ``` #### 关键比喻: - `Operation op` → **外卖订单**(约定回调格式) - `Add/Subtract` → **你的手机号**(具体回调函数) - `Calculator()` → **商家系统**(在合适时机回拨) - `op(x, y)` → **商家拨号动作**(执行回调) #### 实际应用场景: 1. **事件处理**:点击按钮时执行自定义函数 2. **排序算法**:qsort()中自定义比较规则 3. **异步通知**:网络下载完成后触发回调
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值