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 起) |
-
- 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 |
返回值
注释
尽管名称如此,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 函数
参见
|
(C11)
|
在数组中搜索未指定类型的元素
(函数) |
|
C++ documentation
for
qsort
|
|