qsort还能这么玩?

文章介绍了回调函数的概念,即通过函数指针在特定事件中调用的响应函数。并以冒泡排序为例,展示了如何使用C语言实现qsort函数,包括cmp_int比较函数和bubble_sort排序函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.回调函数是什么

回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数
时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
我们可以把调⽤的函数的地址以参数的形式 传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能

2.使用冒泡排序模拟实现qsort函数

#include<stdio.h>
// 比较两个整数的函数,用于排序
int cmp_int(const void* e1, const void* e2) {
    return (*(int*)e1 - *(int*)e2);
}

// 交换两个元素的内容,通过字节操作
void swap1(void* e1, void* e2, int width) {
    int i = 0;
    for (i = 0; i < width; i++) {
        char tmp = *((char*)e1 + i);
        *((char*)e1 + i) = *((char*)e2 + i);
        *((char*)e2 + i) = tmp;
    }
}

// 交换两个元素的内容,通过指针递增
void swap2(char* e1, char* e2, int width) {
    int i = 0;
    for (i = 0; i < width; i++) {
        char tmp = *e1;
        *e1 = *e2;
        *e2 = tmp;
        e1++;
        e2++;
    }
}

// 冒泡排序函数
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2)) {
    int i = 0, j;
    for (i = 0; i < sz - 1; i++) {
        for (j = 0; j < sz - i - 1; j++) {
            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
                swap2((char*)base + j * width, (char*)base + (j + 1) * width, width);
            }
        }
    }
}

// 打印整数数组
void print_arr(int arr[], int sz) {
    int i = 0;
    for (i = 0; i < sz; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

// 测试函数
void test1() {
    int arr[] = {3, 1, 5, 2, 4, 8, 7, 6, 9, 0};
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
    print_arr(arr, sz);
}

// 主函数
int main() {
    test1();  // 调用测试函数
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值