重生之我是一名程序员 34 ——库函数qsort

哈喽啊大家晚上好!

今天给大家带来的知识是——库函数qsort。首先,给大家介绍一下qsort函数, qsort函数是C标准库中的一种排序函数,用于对数组中的元素进行快速排序。它接受四个参数:待排序数组的基地址,数组中元素的个数,每个元素的大小,以及一个函数指针,该函数指定了比较两个元素的规则。qsort将按照指定的规则对数组进行排序,并在排序完成后返回排序后的数组。

想必大家还记得之前我给大家讲过一道C语言中的经典题目——起泡排序法(又叫冒泡排序法),之前我在给大家讲这道题目时是使用了for循环嵌套来实现的,但是今天我们知道了qsort函数,我们就可以使用此函数来实现起泡排序法,会更加的简洁。下面我先给大家说说如何使用qsort函 数,qsort函数用于对数组进行快速排序。它的原型如下:

void qsort(void* base, size_t num, size_t size, int (*compare)(const void*, const void*));

其中:

  • base是要排序的数组的指针;
  • num是数组中元素的个数;
  • size是每个元素的大小(以字节为单位);
  • compare是一个指向函数的指针(简称函数指针),用于比较两个元素的大小关系。

使用qsort函数首先需要定义一个比较函数,它的返回值是一个整数:

int compare(const void* a, const void* b) {
    // 比较的逻辑,返回一个整数
}

比较函数的参数类型为const void*,也就是指向任意类型数据的指针,因此在函数内部需要先将指针转换为对应类型的指针,然后再进行比较。

下面我给大家举一个例子,方便大家更好的认识怎么使用qsort函数,例如:使用qsort函数排序一个整形数组,代码如下:

#include <stdio.h>
//qosrt函数的使⽤者得实现⼀个⽐较函数
int int_cmp(const void * p1, const void * p2)
{
 return (*( int *)p1 - *(int *) p2);
}
int main()
{
 int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
 int i = 0;

 qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
 for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
 {
 printf( "%d ", arr[i]);
 }
 printf("\n");
 return 0;
}

其中,在比较函数中,如果p1-p2大于0的话则进行数组中的两个数的比较和排序(升序),如果想降序输出的话,把return语句中的p1,p2进行交换即可。

好啦,那么到此想必大家也了解怎么使用qsort函数了,那现在我们就用qsort函数来优化起泡排序法吧,如下:

```
#include <stdio.h>
#include <stdlib.h>

// 比较函数
int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

int main() {
    int arr[] = {3, 1, 5, 2, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 使用qsort函数进行排序
    qsort(arr, n, sizeof(int), compare);

    // 输出排序后的结果
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}
```

这里呢跟上面的排序整形数组是差不多的,但需要注意,我们在使用qsort函数时需要引用头文件

#include<stdlib.h>,不然编译器会报警告哦!

那么,今天的知识分享就到此结束啦,感谢大家支持,大家明天见啦!

  • 21
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值