こんにちは。
本日はC言語メモです。
概要
C言語には標準ライブラリに配列をソートする
qsort()という関数があります。
この関数は、stdlib.hに含まれています。
qsort()のプロトタイプは
void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
となります。
引数は、それぞれ以下の意味を持ちます。
- 第1引数:ソート対象配列の先頭ポインタ
- 第2引数:配列の要素数
- 第3引数:1要素のバイト数
- 第4引数:比較関数
qsort()を使用する際、比較関数を作成する必要があります。
比較関数はintを戻り値とし、引数が(const void *, const void *)の関数です。
比較関数の戻り値によってqsort() は配列のソートを行います。
戻り値が正の値の場合、ソートした際の番目が小さく、
戻り値が負の値の場合、ソートした際の番目が大きく、
戻り値が0の場合は同じ番目となります。
昇順にソートするサンプルコード
int型の配列を用意し、その配列を昇順にソートします。
#include <stdio.h> #include <stdlib.h> int compare_asc(const void *val1, const void *val2) { const int *num1 = val1; const int *num2 = val2; int result; if (*num1 < *num2) { return -1; } if (*num1 > *num2) { return 1; } return 0; } int main () { int arr[] = {5, 12, 2, 98, 11, 5}; printf("[before] %d, %d, %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]); int size = sizeof(arr) / sizeof(arr[0]); qsort(arr, size, sizeof(int), compare_int_asc); printf("[after ] %d, %d, %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]); }
実行結果は以下です。
[before] 5, 12, 2, 98, 11, 5 [after ] 2, 5, 5, 11, 12, 98
降順にソートするサンプルコード
int型の配列を用意し、その配列を降順にソートします。
#include <stdio.h> #include <stdlib.h> int compare_int_desc(const void *val1, const void *val2) { const int *num1 = val1; const int *num2 = val2; int result; if (*num1 > *num2) { return -1; } if (*num1 < *num2) { return 1; } return 0; } int main () { int arr[] = {5, 12, 2, 98, 11, 5}; printf("[before] %d, %d, %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]); int size = sizeof(arr) / sizeof(arr[0]); qsort(arr, size, sizeof(int), compare_desc); printf("[after ] %d, %d, %d, %d, %d, %d\n", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]); }
実行結果は以下です。
[before] 5, 12, 2, 98, 11, 5 [after ] 98, 12, 11, 5, 5, 2
以上です。