Namespaces
Variants

qsort, qsort_s

From cppreference.net
定義先ヘッダ <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) と同様ですが、追加のコンテキストパラメータ context comp に渡され、以下のエラーが実行時に検出されて現在インストールされている 制約ハンドラ 関数を呼び出す点が異なります:
  • 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引数として渡される

戻り値

1) (なし)
2) 正常終了時はゼロ、実行時制約違反が検出された場合は非ゼロ

注記

名称にもかかわらず、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関数

関連項目

未指定の型の要素に対して配列を検索する
(関数)