目次から探す
構造体の配列をクイックソートする方法
構造体の配列をソートする方法として、クイックソートが一般的に使われます。
クイックソートは高速なソートアルゴリズムであり、構造体の配列を効率的にソートすることができます。
構造体の配列のソート条件の指定
構造体の配列をソートする際には、ソートの基準となる条件を指定する必要があります。
例えば、構造体が以下のように定義されているとします。
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関数
に渡すことで、構造体の配列を効率的にソートすることができます。
次のページ構造体の配列を複数のキーでソートする方法