名前空間
変種
操作

qsort, qsort_s

提供: cppreference.com
< c‎ | algorithm
ヘッダ <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 - 第1引数が第2引数より小さい場合は負の整数値、第1引数が第2引数より大きい場合は正の整数値、第1引数と第2引数が同等な場合はゼロを返す比較関数。

比較関数のシグネチャは以下と同等であるべきです。

 int cmp(const void *a, const void *b);

関数は渡されたオブジェクトを変更してはならず、同じオブジェクトに対してはその配列内の位置にかかわらず一貫した結果を返さなければなりません。

context - comp に第3引数として渡される追加の情報 (照合シーケンスなど)

[編集] 戻り値

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

[編集] ノート

その名前にもかかわらず、 C も POSIX 標準もこの関数がクイックソートを用いて実装されることも、計算量や安定性のいかなる保証も、要求していません。

他の境界チェック関数と異なり、 qsort_s はサイズゼロの配列を実行時制約違反として扱わず、代わりに配列を変更することなく成功を返します (サイズゼロの配列を受理する他の関数は bsearch_s です)。

qsort_s 以前、 qsort のユーザは比較関数に追加のコンテキストを渡すためにしばしばグローバル変数を使用していました。

[編集]

#include <stdio.h>
#include <stdlib.h>
#include <limits.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 (fails if INT_MIN is present)
}
 
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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.5.2 The qsort function (p: 355-356)
  • K.3.6.3.2 The qsort_s function (p: 609)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.5.2 The qsort function (p: 319)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.5.2 The qsort function

[編集] 関連項目

不特定の型の要素の配列を検索します
(関数) [edit]