C標準ライブラリqsort関数の使用


高速ソート(quick sort)は最も有効なソートアルゴリズムの一つである.
C実装の高速ソートアルゴリズムの関数名はqsort()であり,qsort()関数はデータオブジェクトデータをソートする.その関数のプロトタイプはヘッダファイルstdlibにある.h中
プロトタイプ:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *,const void *));

第1のパラメータは、任意のデータ型のポインタがvoidタイプのポインタに変換できるため、qsort()の第1のパラメータは任意のタイプの配列を指すことができる.
2番目のパラメータは、ソートする要素の数です.
3番目のパラメータは、配列内のデータ・オブジェクトのサイズです.qsort()は最初のパラメータをvoidポインタに変換するため、各配列要素のサイズ情報が失われ、この情報を補充するためにデータオブジェクトのサイズをqsort()に明確に伝えなければならない.
4番目のパラメータは、ソートのルールを決定するために指定された関数を指すポインタです.この関数は、比較を行う2つの要素を指す2つのパラメータを受け入れます.
1番目の要素が2番目の要素より大きい場合、正の数を返し、負の数を返し、0を返します.
 
次の例では、ランダムな浮動小数点数からなる配列を作成し、配列をソートします.
/*
 *  qsort     
 *       void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *,const void *));
 */
#include <stdio.h>
#include <stdlib.h>

#define NUM 40
void fillarray(double ar[], int n);
void showarray(const double ar[], int n);
int mycomp(const void *p1, const void *p2);

int main(void)
{
    double ar[NUM];
    fillarray(ar, NUM);
    printf("Random List:
"); showarray(ar, NUM); qsort(ar, NUM, sizeof(double), mycomp);// printf("
Sorted List:
"); showarray(ar, NUM); return 0; } // void fillarray(double ar[], int n) { int index; for (index = 0; index < n; index++) { ar[index] = (double)rand() / ((double)rand() + 0.1); } } // void showarray(const double ar[], int n) { int index; for (index = 0; index < n; index++) { printf("%9.4f ", ar[index]); if (index % 6 == 5) { putchar('
'); } } } // int mycomp(const void *p1, const void *p2) { const double *a1 = (const double *)p1; const double *a2 = (const double *)p2; if (*a1 < *a2) { return -1; } else if (*a1 == *a2) { return 0; } else { return 1; } }

出力結果:
Random List:    0.0022    0.2390    1.2191    0.3910    1.1021    0.2027    1.3835   20.2830    0.2508    0.8880    2.2179   25.4866    0.0236    0.9308    0.9911    0.2507    1.2802    0.0939    0.9760    1.7217    1.2054    1.0326    3.7892    1.9635    4.1137    0.9241    0.9971    1.5582    0.8955   35.3798    4.0579   12.0460    0.0096    1.0109    0.8506    1.1529    2.3614    1.5876    0.4825    6.8749 Sorted List:    0.0022    0.0096    0.0236    0.0939    0.2027    0.2390    0.2507    0.2508    0.3910    0.4825    0.8506    0.8880    0.8955    0.9241    0.9308    0.9760    0.9911    0.9971    1.0109    1.0326    1.1021    1.1529    1.2054    1.2191    1.2802    1.3835    1.5582    1.5876    1.7217    1.9635    2.2179    2.3614    3.7892    4.0579    4.1137    6.8749   12.0460   20.2830   25.4866   35.3798