qsort, qsort_s
来自 cppreference.com
定义于头文件 <stdlib.h> 中 |
||
(1) | ||
errno_t qsort_s( void* ptr, rsize_t count, rsize_t size, int (*comp)(const void*, const void*, void*), |
(2) | (自 C11 起) |
1) 按升序对由 ptr 指向的给定数组进行排序。数组包含 count 个大小为 size 字节的元素。由 comp 指向的函数用于对象比较。
2) 与 (1) 相同,除了添加了额外的上下文参数 context 传递给 comp,并且以下错误将在运行时检测到并调用当前安装的 约束处理程序 函数
- count 或 size 大于 RSIZE_MAX
- ptr 或 comp 是空指针(除非 count 为零)
- 与所有边界检查函数一样,
qsort_s
仅在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdlib.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。
如果 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 标准不兼容。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 函数(第:待定)
- K.3.6.3.2 qsort_s 函数(第:待定)
- 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 函数
[编辑] 另请参阅
(C11) |
在数组中搜索类型未知的元素 (函数) |
C++ 文档 for qsort
|