• qsort函数详解


    上篇文章,笔者讲解了冒泡排序的方法,原文链接为:一个典列来带领大家了解冒泡排序思想_念君思宁的博客-CSDN博客,有意者请参考一下!

    最近笔者又浅学关于qsort函数的排序方法!下面且听笔者一一道来!

    不知道大家对于qsort函数了解多少!可能仅仅限制在qsort函数是快速排序的函数,至于其他的就……额,不知道了!下面请看笔者对于qsort函数的讲解!但也不敢保懂!!

    下面笔者是参考部分文献得来的内容!敬请欣赏:

    qsort

    1. void qsort (void* base, size_t num, size_t size,
    2. int (*compar)(const void*,const void*));
    对数组的元素进行排序
    

    对 所指向的数组元素进行排序,每个元素的长度为长,使用函数确定顺序。

    此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素对。

    该函数不返回任何值,但通过对所定义的数组元素进行重新排序来修改所指向的数组的内容。

    原文内容为:

    对于qsort我们在上面考研看出来,返回值为void 类型,即:可以排序(大小排序)任意类型的数据!

    下面笔者就定义:进行简单的讲解!!

    1. void qsort (void* base,
    2. size_t num,
    3. size_t size,
    4. int (*compar)(const void*,const void*));

    1.void* base :指向待排序数组的起始位置!

    2.size_t num :待排序数组的元素个数!

    3.size_t size :(所占字节)待排序数组的元素大小!

    4.int (*compar)(const void*,const void*)) 这个就需要我们好好进行分析一下!

    我们可以将int (*compar)(const void*,const void*))  进行分开处理!

    1. int (*compar)(const void*,const void*))
    2. 函数: (const void*,const void*)
    3. 指针: *compar
    4. 返回类型: int

    因此,对于int (*compar)(const void*,const void*)) ,我们可以概述为:比较两个元素大小的函数指针!

    回想一下:对于不同的数据类型,有着不同的比较方式!所以……qsort显现出来独一无二的作用!

    对于两个整型,运用关系运算符进行比较大小(>,<);

    对于两个字符串,使用库函数strcmp进行比较大小;

    对于两个结构体,也得制定比较方式!

    因此我们可以用qsort函数来进行……比较 !

    下面请看笔者用qsort函数测试排序整型数组!请看代码!

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. void print(int arr[], int sz)
    4. {
    5. int i = 0;
    6. for (i = 0; i < sz; i++)
    7. {
    8. printf("%d ", arr[i]);
    9. }
    10. printf("\n");
    11. }
    12. int cmp_int(const void* e1, const void* e2)
    13. {
    14. if (*(int*)e1 > *(int*)e2)
    15. return 1;
    16. else if (*(int*)e1 < *(int*)e2)
    17. return -1;
    18. else
    19. return 0;
    20. }
    21. void test2()
    22. {
    23. int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
    24. int sz = sizeof(arr) / sizeof(arr[0]);
    25. qsort(arr, sz, sizeof(arr[0]), cmp_int);
    26. print(arr, sz); //打印
    27. }
    28. int main()
    29. {
    30. test2();
    31. return 0;
    32. }

    对于上述代码,笔者只对最重要的那一部分进行简单讲解!请读者注意一下!!显而易见的就是该段代码:

    1. int cmp_int(const void* e1, const void* e2)
    2. {
    3. if (*(int*)e1 > *(int*)e2)
    4. return 1;
    5. else if (*(int*)e1 < *(int*)e2)
    6. return -1;
    7. else
    8. return 0;
    9. }

    对于: *(int*)e1 与  *(int*)e2; 我们再定义e1与 e2的时候,是定义的void(空类型),所以在使用之前,先将e1与 e2通过  (int*)e1 与  (int*)e2 强制类型转换为: int* 类型!然后在进行解引用操作!

    对于在该段代码里面的  if 语句的内容,可以更改为:retrun  (*(int*)e1  -  *(int*)e2);  (升序)(要是想要降序,则可以对调一下)

    原因在于:

     qsort函数的返回值为int整型!!

    对于上述代码的运行结果为:

    对于这篇文章,笔者所写内容大致到此结束!!有不同想法的读者请与笔者进行私聊!!

    感激!!

  • 相关阅读:
    MySQL【子查询】
    全息干涉图补零尺寸与三种重构方法重建像间的关系研究
    数字经济的下一步:Web3的潜力与前景
    计算机毕业论文java毕业设计论文题目S2SH实现的校园课程作业网项目[包运行成功]
    CSC关于进一步优化国家公派出国留学服务管理工作的通知
    【STM32】存储器和位带映射(bit band mapping)
    windows10不支持Miracast无线投屏(不能进行无线投影)
    类模板Array带二个模板参数
    解决Maven导入坐标 Cannot resolve Failure to transfer 报错问题
    基于web在线餐饮网站的设计与实现——蛋糕甜品店铺(HTML+CSS+JavaScript)
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126837342