【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 66 5 4 2

ステップ配列の状態交換箇所
初期4 2 5 6
1回目4 2 6 55↔6
2回目4 6 2 52↔6
3回目6 4 2 54↔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 7

3.標準関数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配列要素数
size1要素のバイト数
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 9

4.文字列のソート(辞書順)

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言語エンジニアには重要です。
文字列や構造体の並べ替えにも応用できるので、比較関数の工夫でさまざまなデータに対応できます。