• 【C语言】详细分析库函数qsort


    目录

    1.函数解释

    2.qsort思想改造冒泡排序

    3.qsort排序的类型 


    1.函数解释

    权威定义

     分析:qsort是一个库函数,头文件#include

    函数类型 void,

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

    有四个参数:

    (void*)起始元素地址(int)元素个数(int)每个元素字节数,int cmp(void*p1,void*p2)

    其中规定cmp函数一定是int类型,两个参数为void*类型

    补充说明void*

    他是一个垃圾桶,什么类型都可以接受,最初设计的时候,qsort的作用排序任意类型,所以void*最合适,cmp函数的参数也是,但是在自定义cmp函数,经常要对p1解引用,或者更改

    但是void*不可以解引用,不可以p++

    所以一般需要强制类型转换成所需

    cmp函数的返回值:0,-1,1

    0代表比较的两个数据相等,1表示前一个更大,-1反之


    2.冒泡排序的改造

    整型排序一般熟知有冒泡排序,快速排序,插入排序,选择排序,堆排序

    今天介绍一下冒泡排序新思路

    1. //1.整型
    2. //类似qsort的思想,把传统冒泡排序改造,排序整型类型的数据
    3. #include
    4. void Swap(char* x, char* y,int width)
    5. {
    6. for (int i = 0; i < width; ++i)
    7. {
    8. char tmp = *x;
    9. *x = *y;
    10. *y = tmp;
    11. x++; y++;
    12. }
    13. }
    14. int cmp_int(const void* e1, const void* e2)
    15. {
    16. return ( * (int*)e1 - *(int*)e2); //升序排列
    17. //return (* (int*)e2 - *(int*)e1); //降序排列
    18. }
    19. void bubble_sort(void* base, int n, int width, int(*p)(const void* e1, const void* e2))
    20. {
    21. for(int i=0;i-1;i++)
    22. {
    23. int j = 0;
    24. for (j = 0; j < n - i - 1; ++j)
    25. {
    26. if (p((char*)base + j * width ,(char*)base + (j + 1) * width)>0)
    27. Swap( (char*)base + j * width, (char*)base + (j + 1) * width,width);
    28. }
    29. }
    30. }
    31. void print(int* arr, int n)
    32. {
    33. for (int i = 0; i < n; i++)
    34. printf("%d ", arr[i]);
    35. }
    36. int main()
    37. {
    38. //printf("请输入元素个数\n"); //可以自己选择给什么数字排序
    39. //int n = 0; scanf("%d", &n); //输入元素个数
    40. //int arr[]={0};
    41. //printf("请输入要比较的数字,个数与上次输入要一致\n");
    42. //for (int i = 0; i < n; ++i) //输入要比较的元素
    43. //{
    44. // scanf("%d", &arr[i]);
    45. //}
    46. int arr[] = { 1,2,7,4,10,6 }; //规定数字排序
    47. int n = sizeof(arr) / sizeof(arr[0]);
    48. bubble_sort(arr, n, sizeof(arr[0]), cmp_int);
    49. print(arr, n);
    50. }

    3.qsort函数能排序的类型

    1. //2.qsort排序各种类型
    2. //2.1整型
    3. //int main()
    4. //{
    5. // int arr[] = { 1,2,3,77,99 }; //同样可以用上面自己输入的方法,这里简写成给定数组
    6. // int len = sizeof(arr) / sizeof(arr[0]);
    7. // qsort(arr, len, sizeof(arr[0]), cmp_int);
    8. // print(arr, len);
    9. //}
    10. //2.2字符串
    11. #include
    12. void print2(char* arr, int n)
    13. {
    14. for (int i = 0; i < n; i++)
    15. {
    16. printf("%c ", arr[i]);
    17. }
    18. }
    19. int strcmp_sort(const void* e1, const void* e2)
    20. {
    21. return (*(char*)e1 - *(char*)e2);
    22. }
    23. //int main()
    24. //{
    25. // char arr[] = "adcb";
    26. // int n = strlen(arr);
    27. // qsort(arr, n, sizeof(arr[0]), strcmp_sort);
    28. // print2(arr, n);
    29. //}
    30. //2.3结构体,名字
    31. struct Leader
    32. {
    33. char name[20];
    34. int high;
    35. };
    36. int cmp_name(const void* e1, const void* e2)
    37. {
    38. return (strcmp(((struct Leader*)e1)->name, ((struct Leader*)e2)->name));
    39. }
    40. int cmp_age(const void* e1, const void* e2)
    41. {
    42. return (((struct Leader*)e1)->high-((struct Leader*)e2)->high);
    43. }
    44. int main()
    45. {
    46. struct Leader p[] = { { "d",180 }, { "a",170 } };
    47. int sz= sizeof(p) / sizeof(p[0]);
    48. qsort(p, sz, sizeof(p[0]), cmp_name); //名字
    49. qsort(p, sz, sizeof(p[0]), cmp_age);
    50. }

     


    如果还有不懂欢迎留言,我会及时回复并且详细解释

    创作不易,感谢观看

     

  • 相关阅读:
    我们该如何提升测试效率?
    杰理之充电仓UI 设置相关的接口 API【篇】
    超全Chat GPT论文修改指令
    mac安装java
    文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题
    面试中常见的算法题和其python实现
    集美大学-浙大版《C语言程序设计实验与习题指导(第3版)》
    华纳云:Linux文件不存在无法删除如何解决
    PCB板中符号的意义
    大规模语言模型人类反馈对齐--RLAIF
  • 原文地址:https://blog.csdn.net/weixin_71138261/article/details/126322602