
【6日でできるC言語入門】ソートアルゴリズム
ソートアルゴリズム
ソートアルゴリズムは、配列やリストの要素を決められた順序(昇順や降順)に並べ替える処理です。C言語では自分でアルゴリズムを実装することも、標準ライブラリのqsort関数を使って効率よく並べ替えることもできます。
ソートはプログラミングの基本技術であり、データの検索や統計、整列処理など、様々な場面で役立ちます。
ここではソートの基本から応用まで、サンプルプログラム付きで解説します。

1.ソートの概要と種類
1.1. ソートとは
ソートとは、「並べ替え」のことで、データを**昇順(小さい順)や降順(大きい順)**に整理する処理です。
例:5 3 8 2 → 昇順に並べ替えると 2 3 5 8
1.2 主なソートアルゴリズム
| アルゴリズム名 | 特徴 | 平均計算量 |
|---|---|---|
| バブルソート | 隣り合う値を比較しながら入れ替えを繰り返す、単純で実装しやすい。 | O(n²) |
| 選択ソート | 最小値を順に探して並べ替え。 | O(n²) |
| 挿入ソート | 1つずつ正しい位置に挿入していく。 | O(n²) |
| クイックソート | 分割統治法による高速な並べ替え(qsort関数もこれ) | O(n log n) |
| マージソート | データを分割・統合しながら並べ替える。 | O(n log n) |
2.バブルソートの実装と解説
2.1. バブルソートの仕組み
バブルソートは、隣り合う要素を比較して必要に応じて交換しながら、何度も繰り返して全体を整列させます。
バブルソートの流れ(降順の場合)
例:4 2 5 6 → 6 5 4 2
| ステップ | 配列の状態 | 交換箇所 |
|---|---|---|
| 初期 | 4 2 5 6 | |
| 1回目 | 4 2 6 5 | 5↔6 |
| 2回目 | 4 6 2 5 | 2↔6 |
| 3回目 | 6 4 2 5 | 4↔6 |
| ... | ... | ... |
2.2. バブルソートのC言語実装
プロジェクト/ファイル名: Lesson71_1/main.c
#include <stdio.h>
#define SIZE 4
void show(int*);
void swap(int*, int*);
int main(void) {
int a[SIZE] = {3, 7, 2, 5};
int i, j;
printf("初期配列: ");
show(a);
// バブルソート(昇順)
for (i = 0; i < SIZE - 1; i++) {
for (j = 0; j < SIZE - i - 1; j++) {
if (a[j] > a[j+1]) {
swap(&a[j], &a[j+1]);
}
}
printf("途中経過: ");
show(a);
}
printf("整列後: ");
show(a);
return 0;
}
void show(int* array) {
for (int i = 0; i < SIZE; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}実行結果
初期配列: 3 7 2 5
途中経過: 3 2 5 7
途中経過: 2 3 5 7
途中経過: 2 3 5 7
整列後: 2 3 5 73.標準関数qsortを使ったソート
3.1. qsort関数の概要
C言語の標準ライブラリ<stdlib.h>には、汎用ソート関数qsortが用意されています。qsortはクイックソートアルゴリズムで動作し、任意の型・条件で並べ替えできます。
qsort関数のプロトタイプ
void qsort(
void* base, size_t num, size_t size,
int (*compare)(const void*, const void*)
);| 引数 | 説明 |
|---|---|
| base | ソートしたい配列の先頭ポインタ |
| num | 配列要素数 |
| size | 1要素のバイト数 |
| compare | 比較関数(要素の順序を決めるコールバック関数) |
3.2. qsortの使用例(整数配列の昇順ソート)
プロジェクト/ファイル名: Lesson71_2/main.c
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
int asc(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
void show(int* array) {
for (int i = 0; i < SIZE; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
int main(void) {
int data[SIZE] = {9, 3, 7, 1, 6};
printf("初期配列: ");
show(data);
qsort(data, SIZE, sizeof(int), asc);
printf("ソート後: ");
show(data);
return 0;
}実行結果
初期配列: 9 3 7 1 6
ソート後: 1 3 6 7 94.文字列のソート(辞書順)
4.1. 文字列配列のソート例
プロジェクト/ファイル名: Lesson71_3/main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 4
int cmp_str(const void* a, const void* b) {
return strcmp(*(const char**)a, *(const char**)b);
}
void show(char** array) {
for (int i = 0; i < SIZE; i++) {
printf("%s ", array[i]);
}
printf("\n");
}
int main(void) {
char* words[SIZE] = {"banana", "apple", "lemon", "grape"};
printf("初期: ");
show(words);
qsort(words, SIZE, sizeof(char*), cmp_str);
printf("ソート後: ");
show(words);
return 0;
}実行結果
初期: banana apple lemon grape
ソート後: apple banana grape lemonまとめ
ソートアルゴリズムは、データの整列・管理の基本です。
- バブルソートのような「自作アルゴリズム」で原理を学び。
- qsort関数のような「標準ライブラリ」で実用性を高める。
この両方を理解しておくことがC言語エンジニアには重要です。
文字列や構造体の並べ替えにも応用できるので、比較関数の工夫でさまざまなデータに対応できます。
