MENU

【C言語】標準ライブラリのクイックソート(qsort)の使い方

目次から探す

標準ライブラリのqsort関数

qsort関数の概要

qsort関数は、C言語の標準ライブラリに含まれるソート関数です。

この関数を使用することで、配列や構造体などの要素をソートすることができます。

qsort関数はクイックソートアルゴリズムを使用しており、高速なソートが可能です。

qsort関数の使い方

配列のソート

qsort関数を使用して配列をソートする方法を説明します。

まず、ソートしたい配列を用意します。

次に、qsort関数を呼び出し、以下のような形式で引数を指定します。

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
  • base: ソートする配列の先頭要素へのポインタ
  • nmemb: 配列の要素数
  • size: 配列の要素のサイズ
  • compar: 比較関数へのポインタ

以下は、整数型の配列を昇順にソートする例です。

#include <stdio.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}
int main() {
    int arr[] = {5, 2, 8, 1, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, n, sizeof(int), compare);
    printf("ソート結果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}
ソート結果: 1 2 5 8 9

構造体のソート

qsort関数を使用して構造体をソートする方法を説明します。

構造体のソートでは、比較関数を適切に実装する必要があります。

以下は、構造体のメンバでソートする例です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 構造体の定義
typedef struct {
    char name[20];
    int age;
} Person;
// 比較関数
int compare(const void *a, const void *b) {
    return strcmp(((Person*)a)->name, ((Person*)b)->name);
}
int main() {
    Person people[] = {
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 20}
    };
    int n = sizeof(people) / sizeof(people[0]);
    qsort(people, n, sizeof(Person), compare);
    printf("ソート結果:\n");
    for (int i = 0; i < n; i++) {
        printf("名前: %s, 年齢: %d\n", people[i].name, people[i].age);
    }
    return 0;
}
ソート結果:
名前: Alice, 年齢: 25
名前: Bob, 年齢: 30
名前: Charlie, 年齢: 20

ソートの基準を指定する

qsort関数では、比較関数を使用してソートの基準を指定することができます。

比較関数は、ソートの基準に応じて適切に実装する必要があります。

以下は、降順でソートする例です。

#include <stdio.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
    return (*(int*)b - *(int*)a);
}
int main() {
    int arr[] = {5, 2, 8, 1, 9};
    int n = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, n, sizeof(int), compare);
    printf("ソート結果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}
ソート結果: 9 8 5 2 1
1 2 3
目次から探す