• qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数


    个人主页点我进入主页

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

    C语言刷题

    欢迎大家点赞,评论,收藏。

    一起努力,一起奔赴大厂。

    目录

    1.qsort函数

    1.1qsort函数的参数

    1.2利用qsort函数排序整形数据

    1.3利用qsort函数排序结构体数据

    2.模拟实现qsort函数

    2.1冒泡排序

    2.2代码实现


             今天主要给大家带来的是对于qsort函数的详细讲解以及使用冒泡排序模拟实现qsort函数,我们这里包括qsort函数的参数的理解和使用针对数组结构体进行升序降序排序,模拟qsort函数的参数。

    1.qsort函数

    1.1qsort函数的参数

            对于qsort函数,我相信大家大部分还是第一次见到这个函数,我们先进入网站cplusplus

     返回旧版,查找qsort函数

     我们看到qsort函数的头文件是stdlib.h,我们可以发现qsort函数具定义为

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

     

            在这里base是指我们要传入的数组 ,num是指传入数组的元素个数,size是指数组一个元素的所占的字节数,int (*compar)(const void*,const void*)是一个函数指针,在这里需要我们建立一个函数

             这个函数指针的参数是void*类型,因为qsort函数可以排序任意类型的数据,使用时强制转换就可以使用。

    1.2利用qsort函数排序整形数据

    1. #include
    2. #include
    3. int comper(const void* e1, const void* e2)
    4. {
    5. return *(int*)e1 - *(int*)e2;
    6. }
    7. int main()
    8. {
    9. int arr[5] = { 0,2,1,4,3 };
    10. int sz = sizeof(arr) / sizeof(arr[0]);
    11. qsort(arr, sz, sizeof(arr[0]), comper);
    12. int i;
    13. for (i = 0; i < sz; i++)
    14. {
    15. printf("%d ", arr[i]);
    16. }
    17. }

    我们运行后可以得到

    为升序排序,我们想要改为降序排序只需要将我们的comper函数进行修改

    1. int comper(const void* e1, const void* e2)
    2. {
    3. return *(int*)e2- *(int*)e1 ;
    4. }

    运行后为降序排序。

    1.3利用qsort函数排序结构体数据

    1. #include
    2. #include
    3. typedef struct student
    4. {
    5. int age;
    6. char num[20];
    7. }stu;
    8. int comper(const void* e1, const void* e2)
    9. {
    10. return ((stu*)e1)->age - ((stu*)e2)->age;
    11. }
    12. int main()
    13. {
    14. stu arr[3] = { 20,"zhangsan",19,"libai",22,"aiqiyi" };
    15. int sz = sizeof(arr) / sizeof(arr[0]);
    16. qsort(arr, sz, sizeof(arr[0]), comper);
    17. int i;
    18. for (i = 0; i < sz; i++)
    19. {
    20. printf("%d ", arr[i].age );
    21. }
    22. return 0;
    23. }

    在进行比较名字是我们需要用到strcmp函数具体代码如下

    1. int comper(const void* e1, const void* e2)
    2. {
    3. return strcmp(((stu*)e1)->num , ((stu*)e2)->num);
    4. }

    2.模拟实现qsort函数

            我们前面讲过想对数据进行排序可以使用冒泡排序,但是冒泡排序却有一些局限性,我们在这里利用冒泡排序来模拟实现qsort函数。

    2.1冒泡排序

      对于冒泡排序我们主要的代码为

    1. void bulubulu(int arr[],int sz)
    2. {
    3. int i, j,temp;
    4. for (i = 0; i < sz - 1; i++)
    5. {
    6. for (j = 0; j < sz - 1 - i; j++)
    7. {
    8. if (arr[j] > arr[j + 1])
    9. {
    10. temp = arr[j];
    11. arr[j] = arr[j + 1];
    12. arr[j + 1] = temp;
    13. }
    14. }
    15. }
    16. }

    在这里我们主要就是依靠冒泡排序进行实现。

    2.2代码实现

    1. #include
    2. #include
    3. #include
    4. int comper(const void* e1, const void* e2)
    5. {
    6. return *(int*)e1 - *(int*)e2;
    7. }
    8. void swap(char *p,char*q,size_t sz)
    9. {
    10. int i;
    11. char temp;
    12. for (i = 0; i < sz; i++)
    13. {
    14. temp = *p;
    15. *p = *q;
    16. *q = temp;
    17. p++;
    18. q++;
    19. }
    20. }
    21. void bulubulu(void *base,size_t sz,size_t size)
    22. {
    23. int i, j;
    24. for (i = 0; i < sz - 1; i++)
    25. {
    26. for (j = 0; j < sz - 1 - i; j++)
    27. {
    28. if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)
    29. {
    30. swap((char*)base+j*size,(char*)base+(j+1)*size,sz);
    31. }
    32. }
    33. }
    34. }
    35. void my_qsort(void *base,size_t num,size_t size,int(*comper)(const void *e1,const void *e2))
    36. {
    37. bulubulu(base, num, size);
    38. }
    39. int main()
    40. {
    41. int arr[5] = { 0,2,1,5,3 };
    42. int sz = sizeof(arr) / sizeof(arr[0]);
    43. my_qsort(arr, sz, sizeof(arr[0]), comper);
    44. int i;
    45. for (i = 0; i < sz; i++)
    46. printf("%d ", arr[i]);
    47. }

            在这里,我们想排序一个整型数组,我们先得到数组有几个元素,每个元素占用几个字节,在我怕们的my_qsort函数中采用void*base是因为我们不知道要排序的元素是什么类型,我们进入冒泡排序也就是bulubulu函数中,在这里最为关键的是if (comper((char*)base + j * size, (char*)base + (j + 1) * size)>0)和swap((char*)base+j*size,(char*)base+(j+1)*size,sz)这两句,由于我们不知道想要排序的是什么类型,base是void*类型,想要使用swap函数和comper函数需要我们传送地址,我们将base强制转换为char*类型,我们还有一个元素占用的字节数size,再根据是第几个元素得到它的地址,在swap中我们是一个字节一个字节的进行交换。在这里comper是我们用户自己写的,其余的只需要my_qsort就可以解决。

    今天的内容就结束了,希望大家可以学到很多东西。

  • 相关阅读:
    【Python】文本文件处理
    linux安装mysql
    K-Means(上):数据分析 | 数据挖掘 | 十大算法之一
    极智开发 | Ant Design 组件库之步骤条
    关于地方美食的HTML网页设计——地方美食介绍网站 HTML顺德美食介绍 html网页制作代码大全
    day16:MyBatis注解开发
    第四章 文件管理 十、文件系统的全局结构
    Shopee买家号有什么作用?如何才能拥有大量的虾皮买家号?
    蓝牙耳机热销榜是哪些?盘点性价比蓝牙耳机排行榜
    快速排序
  • 原文地址:https://blog.csdn.net/Infernal_Puppet/article/details/132919664