qsort, qsort_s
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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_MAXptr或comp是空指针(除非count为零)
- 同所有边界检查函数,
qsort_s,仅若实现定义__STDC_LIB_EXT1__且用户在包含 <stdlib.h> 前定义__STDC_WANT_LIB_EXT1__为整数常量 1 才保证可用。
若 comp 指示两元素相等,则它们排序后的结果是未指定的。
参数
| ptr | - | 指向待排序的数组的指针 |
| count | - | 数组的元素数目 |
| size | - | 数组每个元素的字节大小 |
| comp | - | 比较函数。如果首个参数小于 第二个,那么返回负整数值,如果首个参数大于 第二个,那么返回正整数值,如果两个参数等价,那么返回零。 比较函数的签名应等价于如下形式:
该函数必须不修改传递给它的对象,而且在调用比较相同对象时必须返回一致的结果,与它们在数组中的位置无关。 |
| 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 The qsort function (第 TBD 页)
- K.3.6.3.2 The qsort_s function (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.22.5.2 The qsort function (第 258-259 页)
- K.3.6.3.2 The qsort_s function (第 442-443 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.22.5.2 The qsort function (第 355-356 页)
- K.3.6.3.2 The qsort_s function (第 609 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.20.5.2 The qsort function (第 319 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.10.5.2 The qsort function
参阅
(C11) |
在未指定类型的数组中搜索一个元素 (函数) |
qsort 的 C++ 文档
| |