命名空间
变体
操作

qsort, qsort_s

来自 cppreference.cn
< c‎ | algorithm
定义于头文件 <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 指向的给定数组进行升序排序。数组包含 countsize 字节的元素。指向 comp 的函数用于对象比较。
2)(1) 相同,除了额外的上下文参数 context 被传递给 comp,并且在运行时检测到以下错误并调用当前安装的 约束处理函数
  • countsize 大于 RSIZE_MAX
  • ptrcomp 是空指针(除非 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)。

qsort_sWindows CRT 中的实现与 C 标准不兼容。Microsoft 的版本声明为: 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); // possible shortcut
 
    // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of
                           // integer overflow, such as with INT_MIN here
}
 
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 函数 (p: 待定)
  • K.3.6.3.2 qsort_s 函数 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.22.5.2 qsort 函数 (p: 258-259)
  • K.3.6.3.2 qsort_s 函数 (p: 442-443)
  • 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 函数

[编辑] 参见

在数组中搜索未指定类型的元素
(函数) [编辑]
C++ 文档 关于 qsort