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 がゼロの場合を除く)
-
すべての境界チェック付き関数と同様に、
qsort_sは、実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <stdlib.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証されます。
comp が2つの要素を等価と示す場合、結果のソート済み配列におけるそれらの順序は未規定です。
目次 |
パラメータ
| ptr | - | ソート対象の配列へのポインタ |
| count | - | 配列の要素数 |
| size | - | 配列の各要素のサイズ(バイト単位) |
| comp | - |
比較関数。最初の引数が2番目の引数より
小さい
場合は負の整数値、最初の引数が2番目の引数より
大きい
場合は正の整数値、引数が等価の場合はゼロを返す。
比較関数のシグネチャは以下と同等であるべき: int cmp ( const void * a, const void * b ) ; この関数は渡されたオブジェクトを変更してはならず、配列内の位置に関わらず同じオブジェクトに対して呼び出された場合には一貫した結果を返さなければならない。 |
| context | - | 追加情報(照合順序など)。 comp に第3引数として渡される |
戻り値
注記
名称にもかかわらず、C言語およびPOSIX標準は、この関数が quicksort を用いて実装されることや、計算量や安定性に関する保証を一切要求していません。
他の境界チェック付き関数とは異なり、
qsort_s
はゼロサイズの配列を実行時制約違反として扱わず、代わりに配列を変更せずに正常に返ります(ゼロサイズの配列を受け入れる他の関数は
bsearch_s
です)。
qsort_s
の実装は、
Windows 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: TBD)
-
- K.3.6.3.2 qsort_s関数 (p: TBD)
- 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関数
関連項目
|
(C11)
|
未指定の型の要素に対して配列を検索する
(関数) |
|
C++ documentation
for
qsort
|
|