名前空間
変種
操作

qsort, qsort_s

From cppreference.com
ヘッダー <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 が指す配列を昇順にソートします。配列には size バイトの count 個の要素が含まれています。comp が指す関数はオブジェクトの比較に使用されます。
2) (1) と同じですが、追加のコンテキストパラメータ contextcomp に渡され、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出されます。
  • count または sizeRSIZE_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番目の引数として渡されます。

[編集] 戻り値

1) (なし)
2) 成功した場合はゼロ、実行時制約違反が検出された場合はゼロ以外

[編集] 備考

名前にもかかわらず、C規格もPOSIX規格も、この関数がクイックソートを使用して実装されることを要求しておらず、複雑さや安定性の保証もしていません。

他の境界チェック関数とは異なり、`qsort_s` はサイズゼロの配列を実行時制約違反として扱わず、代わりに配列を変更せずに正常に終了します(サイズゼロの配列を受け入れるもう1つの関数は 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関数 (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関数

[編集] 関連項目

型が指定されていない要素を配列から検索する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)