【C】指针语法下篇@指针进阶 —— 回调函数 | 采用冒泡排序方式模拟实现qsort

简介: 回调函数 | 采用冒泡排序方式模拟实现qsort

@TOC

本文将重点介绍回调函数。
反爬链接

正文开始@一个人的乐队

1.回调函数

先给出回调函数的概念,在头脑中有个大致印象就行:

  1. 回调函数就是一个通过函数指针调用的函数。
  2. 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。(这句话可以理解为一种机制

)

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

还记得上篇文章中,那段超级冗余的计算器代码吗?
现在将采用回调函数机制继续对它进行改造:

在这里插入图片描述

2.使用回调函数,模拟实现qsort(采取冒泡排序的方式)

回忆冒泡排序,并说明它的局限性:
在这里插入图片描述
冒泡排序:
在这里插入图片描述
qcort即快速排序,是C语言本身具有的函数,打开MSDN搜索一下:
在这里插入图片描述
那它是如何实现任意类型排序的呢?
在这里插入图片描述
既然明白了qsort的参数,就来应用一下吧!
(注:现在只是应用,不涉及底层原理)

1.测试整型数组
在这里插入图片描述
2.测试结构体类型数组
①以年龄为排序标准
在这里插入图片描述
②以姓名为排序标准
在这里插入图片描述

经过上面测试看出,qsort确实可以排各种各样的数值
通过提取出不同的比较方法(利用了回调函数的机制)

那它的底层究竟是如何实现的呢?现在我们就用BubbleSort()来模拟实现qsort
注:只是模拟实现,底层原理并不完全相同
在这里插入图片描述
最后附上完整代码:

#include<stdio.h>

void Swap(char* buf1, char* buf2, size_t width)
{
    size_t i = 0;
    for (i = 0; i < width; i++)
    {
        char tmp = *buf1;
        *buf1 = *buf2;
        *buf2 = tmp;
        buf1++;
        buf2++;
    }
}

int cmp(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}

//用回调函数实现一个通用的冒泡排序
void BubbleSort(void* base, size_t num, size_t width,int(*cmp)(const void* e1, const void* e2))
{
    size_t i = 0;
    for (i = 0; i < num - 1; i++)
    {
        size_t j = 0;
        for (j = 0; j < num - i - 1; j++)
        {
            if (cmp((char*)base + j* width, (char*)base + (j + 1)*width)>0)
            {
                Swap((char*)base + j*width, (char*)base + (j + 1)*width,width);
            }
        }
    }
}

void print(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
}

//测试自定义函数BubbleSort
int main()
{
    int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    BubbleSort(arr, sz, sizeof(arr[0]), cmp);
    print(arr, sz);
    return 0;
}

至此本专题结束

相关文章
|
5月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
1月前
|
C++
指针中的回调函数与qsort的深度理解与模拟
本文详细介绍了回调函数的概念及其在计算器简化中的应用,以及C++标准库函数qsort的原理和使用示例,包括冒泡排序的模拟实现。
19 1
|
1月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
24 2
|
1月前
魔法指针 之 函数指针 回调函数
魔法指针 之 函数指针 回调函数
14 0
|
4月前
|
存储 C++ 运维
开发与运维数组问题之指针的定义语法如何解决
开发与运维数组问题之指针的定义语法如何解决
35 6
|
3月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
3月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
3月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
|
5月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
5月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)