qsort, qsort_s
定义于头文件 <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) ,除了传递给
comp
附加环境参数 context
,还会在运行时检测下列错误,并调用当前安装的制约处理函数:
-
count
或size
大于 RSIZE_MAX -
key
、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 )。
在 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); // 可行的简写 // 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
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.22.5.2 The qsort function (p: 355-356)
- K.3.6.3.2 The qsort_s function (p: 609)
- C99 standard (ISO/IEC 9899:1999):
- 7.20.5.2 The qsort function (p: 319)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.10.5.2 The qsort function
参阅
(C11) |
在未指定类型的数组中搜索一个元素 (函数) |