Namespaces
Variants

qsort, qsort_s

From cppreference.net
定义于头文件 <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 所指向的给定数组进行升序排序。该数组包含 count 个元素,每个元素大小为 size 字节。由 comp 指向的函数用于对象比较。
2) (1) 相同,区别在于向 comp 传递了额外的上下文参数 context ,且在运行时检测到以下错误时会调用当前安装的 约束处理函数
  • 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) (无)
2) 成功时返回零,检测到运行时约束违规时返回非零值

注释

尽管名称如此,C语言和POSIX标准均未要求此函数必须基于 快速排序 实现,也未对其时间复杂度或稳定性作出任何保证。

与其他边界检查函数不同, qsort_s 不会将零大小数组视为运行时约束违规,而是会成功返回且不修改数组(另一个接受零大小数组的函数是 bsearch_s )。

Windows CRT 中的 qsort_s 实现与 C 标准不兼容。微软版本的声明如下: void qsort_s ( void * base, size_t num, size_t width,
int ( * compare ) ( void * , const void * , const void * ) , void * context ) ;
。 该函数不返回值,且比较函数的参数顺序与标准相反: context 参数被置于首位。

示例

#include <limits.h>
#include <stdio.h>
#include <stdlib.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); // 可能的快捷方式
    // return arg1 - arg2; // 错误的快捷方式:在整数溢出时(例如此处使用 INT_MIN)会导致未定义行为
}
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

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.22.5.2 qsort 函数 (页: TBD)
  • K.3.6.3.2 qsort_s 函数 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.22.5.2 qsort 函数 (页码: 258-259)
  • K.3.6.3.2 qsort_s 函数 (页码: 442-443)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.22.5.2 qsort 函数 (页: 355-356)
  • K.3.6.3.2 qsort_s 函数 (页: 609)
  • C99标准(ISO/IEC 9899:1999):
  • 7.20.5.2 qsort函数(页:319)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.10.5.2 qsort 函数

参见

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