• qsort () 库函数


    标准库

    C标准库------>   

     声明

    void __cdecl qsort(void *_Base, size_t _NumOfElements, size_t _SizeOfElements,     _CoreCrtNonSecureSearchSortCompareFunction _CompareFunction)
    void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
    

    这两个是一样的 

    参数 

    第一个void 代表了qsort() 不返回任何值

    __cdecl 是用来声明在动态链接库里面的函数原型,一般不用管

    ------------------------------------------------------------------------------------

    第一个参数是 你要排序的数组的地址,或者是数组第一个元素的地址

    第二个参数是  你要排序的元素个数

    第三个参数是 排序的每个元素的大小---单位为字节

    第四个参数是 比较两个元素的函数或者是它的地址(函数指针)

    比较函数 

    qsort可以对结构体、一维int数组、二维int数组、一维字符数组、二维字符数组排序

    是因为接收参数时用void * 指针接收,所有其它类型的指针都可以隐式转换为空类型指针 ,而空类型指针只存储地址的值,没有类型,在需要的时候可以强制类型转换成特定的类型,这样就可以对不同类型排序了

    当然还有核心,就是比较函数,在什么时候需要改变两个元素的位置呢 ?这就是比较函数完成的事 记住比较函数的参数一定是const void *类型的,因为在头文件定义中就是这样,如若不然,就会报错

    1. int compare_int(const void * a, const void * b)
    2. {
    3. int *a1 = (int*)a;
    4. int *b1 = (int*)b;
    5. return (*a1) - (*b1);
    6. }

    这个函数只能用来比较两个int 变量 也就是当参数 是这个函数时,可以对int一维数组排序

     如果compar_int返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面

     具体使用

    排序一个一维int 数组

    1. #include <iostream>
    2. #include <stdlib.h>
    3. using namespace std;
    4. int compare_int(const void * a, const void * b)
    5. {
    6. int *a1 = (int*)a;
    7. int *b1 = (int*)b;
    8. return (*a1) - (*b1);
    9. }
    10. int main(void)
    11. {
    12. int arr[] = { 85,64,14,28,99,42,20,1,57,98,74 };
    13. qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int),&compare_int);
    14. //qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), compare_int); //或者是没有&,因为函数名就是函数的地址
    15. for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    16. {
    17. cout << arr[i] << " ";
    18. }
    19. return 0;
    20. }

  • 相关阅读:
    数据可视化在监控易中的艺术与实践
    worthington组织解离方法丨用 95% O 2 :5% CO 2平衡
    c/c++ 静态代码检查工具
    selenium自动化chrome
    软件测试面试大家是不是一问到项目就不会了?
    数据结构--双链表
    log4j漏洞CVE-2021-44228复现-排雷篇
    使用vuedraggable实现拖拽式操作实战
    Redis 持久化
    【代码随想录】二刷-数组
  • 原文地址:https://blog.csdn.net/qq_66805048/article/details/132969233