qsort (Algorithms) – C 中文开发手册

[
  •   C 语言中文开发手册

    qsort (Algorithms) - C 中文开发手册

    在头文件<stdlib.h>中定义
    void qsort(void * ptr,size_t count,size_t size,int(* comp)(const void *,const void *)); (1)
    errno_t qsort_s(void * ptr,rsize_t count,rsize_t size,int(* comp)(const void *,const void *,void *),void * context); (2) (自C11以来)

    1)按照升序对ptr指向的给定数组进行排序。 该数组包含大小字节的计数元素。 由comp指向的函数用于对象比较。2)与(1)相同,不同之处在于附加上下文参数上下文传递给comp,并且在运行时检测到以下错误并调用当前安装的约束处理函数:count或size大于RSIZE_MAX ptr或comp是一个空指针(除非count是零)与所有边界检查函数一样,只有当__STDC_LIB_EXT1__由实现定义并且在包含stdlib.h之前用户将__STDC_WANT_LIB_EXT1__定义为整数常量1时,qsort_s才能保证可用。如果comp表示两个元素是等价的,则它们在结果排序数组中的顺序是未定义的。

    参数

    PTR - 指向要排序的数组的指针
    count - 数组中元素的个数
    size - 数组中每个元素的大小(以字节为单位)
    comp - 比较函数,如果第一个参数小于第二个参数,则返回负整数值;如果第一个参数大于第二个参数,则返回正整数值;如果参数相等,则返回零。比较函数的签名应该等同于以下内容:int cmp(const void * a,const void * b); 该函数不得修改传递给它的对象,并且在调用相同对象时必须返回一致的结果,而不管它们在数组中的位置。
    context - 附加信息(例如,整理顺序),作为第三个参数传递给comp

    返回值

    1)(none) 2)成功时返回零,如果检测到运行时约束违规,则返回非零

    注意

    尽管有这个名字,C和POSIX标准都不需要使用快速排序来实现此功能,也不需要任何复杂性或稳定性保证。与其他边界检查函数不同,qsort_s不会将零大小的数组视为运行时约束冲突,而是在不更改数组的情况下成功返回(另一个接受零大小数组的函数bsearch_s)。直到qsort_s,用户qsort经常使用的全局变量传递附加的上下文的比较功能。

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
     
    int compare_ints(const void* a, const void* b)
    {
        int arg1 = *(const int*)a;
        int arg2 = *(const int*)b;
     
        if (arg1 < arg2) return -1;
        if (arg1 > arg2) return 1;
        return 0;
     
        // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
        // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)
    }
     
    int main(void)
    {
        int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
        int size = sizeof ints / sizeof *ints;
     
        qsort(ints, size, sizeof(int), compare_ints);
     
        for (int i = 0; i < size; i++) {
            printf("%d ", ints[i]);
        }
     
        printf("\n");
    }

    输出:

    -2147483648 -743 -2 0 2 4 99

    参考

    C11标准(ISO / IEC 9899:2011): 7.22.5.2 qsort函数(p:355-356) K.3.6.3.2 qsort_s函数(p:609) C99标准(ISO / IEC 9899:1999): 7.20.5.2 qsort函数(p:319) C89 / C90标准(ISO / IEC 9899:1990): 4.10.5.2 qsort函数

    扩展内容

    bsearchbsearch_s(C11) 在数组中搜索未指定类型的元素(函数)

    | 用于qsort的C ++文档 |

  •   C 语言中文开发手册
    ]
    转载请保留页面地址:https://www.breakyizhan.com/c-3/27851.html

    posted on 2020-07-07 21:35  MrAit  阅读(230)  评论(0编辑  收藏  举报

    导航