なんだかGoodVibes

日々の勉強メモです。

【C】qsort関数を使用してソートしてみる

こんにちは。
本日は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



以上です。