qsort

 標準ライブラリ関数 qsort は, stdlib.h の中で次のように宣言されており,ポインタ base を先頭とする配列(ただし,要素数は num,一つの要素のサイズは size)の内容を,指定された比較方法 compareで昇順に並べ替える関数である.

void qsort(void *base, size_t num, size_t size, 
           int (*compare)(const void*, const void*))

 この関数の使用例は次のようになる.

#include <stdlib.h>

int compare_int(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}

main()
{
    int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 5, 7};
    int i;

    qsort(data, 10, sizeof(int), compare_int);
    for (i = 0; i < 10; i++) {
        printf("%3d", data[i]);
    }
    printf("\n");
}
  1  2  2  3  3  3  4  5  6  7

 最初に qsort が宣言されている stdlib.h をインクルードする.

 次に compare_int(a, b) という,整数型ポインタを二つ引数にとり,それらが指す場所にある整数値を比較した結果を返す関数を自作する.この関数は,*a と *b とがソートした結果でどちらが先でどちらが後に来て欲しいかを,次のように整数値で返す関数である.

*a が *b よりも先であるとき負の値
*a と *b とのどちらが先でもいいとき 
*a が *b よりも後であるとき正の値

 ここで作成した関数だと, *a-*b の値をその関数値としているので,*a < *b のとき,a が先,*a = *b のとき,どちらでもよい,*a > *b のとき,a が後となる.すなわち,小さい順に並べ替えることになる.

この関数は qsort に第4引数として引き渡されるのだが, qsort の第4引数の型 int (*compare)(const void*, const void*) に合わせるため, int compare_int(const void *a, const void *b) と宣言している。そして,関数の中で *(int*)aとキャストして使用する。