MENU

【C言語】構造体をクイックソートする方法を解説

目次から探す

構造体の配列をクイックソートする方法

構造体の配列をソートする方法として、クイックソートが一般的に使われます。

クイックソートは高速なソートアルゴリズムであり、構造体の配列を効率的にソートすることができます。

構造体の配列のソート条件の指定

構造体の配列をソートする際には、ソートの基準となる条件を指定する必要があります。

例えば、構造体が以下のように定義されているとします。

typedef struct {
    int id;
    char name[50];
    int age;
} Person;

この場合、idやageなどのフィールドを基準にソートすることができます。

ソート条件を指定するためには、比較関数を作成する必要があります。

以下に、idを基準にソートするための比較関数の例を示します。

int compareById(const void* a, const void* b) {
    const Person* personA = (const Person*)a;
    const Person* personB = (const Person*)b;
    if (personA->id < personB->id) {
        return -1;
    } else if (personA->id > personB->id) {
        return 1;
    } else {
        return 0;
    }
}

この比較関数を用いて、構造体の配列をソートすることができます。

クイックソートの実装例

以下に、構造体の配列をクイックソートするための実装例を示します。

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    int id;
    char name[50];
    int age;
} Person;
int compareById(const void* a, const void* b) {
    const Person* personA = (const Person*)a;
    const Person* personB = (const Person*)b;
    if (personA->id < personB->id) {
        return -1;
    } else if (personA->id > personB->id) {
        return 1;
    } else {
        return 0;
    }
}
int main() {
    Person people[] = {
        {3, "Alice", 25},
        {1, "Bob", 30},
        {2, "Charlie", 20}
    };
    int numPeople = sizeof(people) / sizeof(people[0]);
    qsort(people, numPeople, sizeof(Person), compareById);
    for (int i = 0; i < numPeople; i++) {
        printf("ID: %d, Name: %s, Age: %d\n", people[i].id, people[i].name, people[i].age);
    }
    return 0;
}

このプログラムでは、Person型の配列を定義し、それをidを基準にクイックソートしています。

ソート後の結果を表示するために、forループを使用して配列の要素を順番に表示しています。

ソート条件を指定するための比較関数を作成し、それをqsort関数に渡すことで、構造体の配列を効率的にソートすることができます。

1 2
目次から探す