🌙

Moscow (MSK):

Date: Feb. 23, 2026

Time: 01:54:39

🔆

Tokyo (JST):

Date: Feb. 23, 2026

Time: 07:54:39

初心者のためのソートアルゴリズム

投稿: Jan. 18, 2026

本記事の日本語版は、いくつかの翻訳方法を組み合わせて作成しています。 できる限り英語版の内容やニュアンスに近づけるよう努めていますが、私たちはまだ日本語を学習中のため、不自然な表現や誤りが含まれている場合があります。ご理解とご支援に感謝いたします。


ソートアルゴリズムは、プログラミングやコンピュータサイエンスを学ぶ際に、多くの人が最初に触れる重要なトピックのひとつです。 論理的に考える力、アルゴリズムがパフォーマンスに与える影響、そして「なぜある解法が他より優れているのか」を理解する助けになります。

この初心者向けガイドでは、次のことを解説します。

  • 各ソートアルゴリズムが何をしているのか
  • それぞれの シンプルな Python の例
  • どんな場面で使うべきか(そして使うべきでないか)

途中で「遅い」「効率が悪い」と感じるものがあっても心配しないでください。 それも学習プロセスの大切な一部です。

ソートアルゴリズムとは?

ソートアルゴリズムとは、要素を順番に並べるための手順を定めた方法です。

例:

[5, 2, 9, 1]

ソート後:

[1, 2, 5, 9]

アルゴリズムによって、やり方はさまざまで、速度にも大きな違いがあります。

バブルソート

何をするか: 隣り合う要素を比較し、順序が逆なら入れ替えます。

考え方: 「一番大きな数を、少しずつ末尾へ浮かび上がらせる」

def bubble_sort(arr):
    for i in range(len(arr)):
        for j in range(0, len(arr) - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

用途: ソートの仕組みを学ぶため(実用ではほぼ使われない)

選択ソート

何をするか: 最小の値を見つけて、正しい位置に配置します。

def selection_sort(arr):
    for i in range(len(arr)):
        min_index = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]

用途: 「選択する」ロジックの理解

挿入ソート

何をするか: 要素を1つずつ、正しい位置に挿入していきます。

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

用途: 要素数が少ない場合や、ほぼ整列済みのデータ

マージソート

何をするか: 配列を半分に分け、それぞれをソートしてから結合します。

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left = arr[:mid]
        right = arr[mid:]

        merge_sort(left)
        merge_sort(right)

        i = j = k = 0
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                arr[k] = left[i]
                i += 1
            else:
                arr[k] = right[j]
                j += 1
            k += 1

        while i < len(left):
            arr[k] = left[i]
            i += 1
            k += 1

        while j < len(right):
            arr[k] = right[j]
            j += 1
            k += 1

用途: 大規模データで、安定性が重要な場合

クイックソート

何をするか: 基準値(ピボット)を選び、小さい値と大きい値に分割します。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

用途: 高速な汎用ソート

ヒープソート

何をするか: ヒープと呼ばれる特殊な木構造を使います。

import heapq

def heap_sort(arr):
    heapq.heapify(arr)
    return [heapq.heappop(arr) for _ in range(len(arr))]

用途: メモリ効率が重要な場合

カウントソート

何をするか: 各値が何回出現するかを数えます。

def counting_sort(arr):
    max_val = max(arr)
    count = [0] * (max_val + 1)

    for num in arr:
        count[num] += 1

    sorted_arr = []
    for i in range(len(count)):
        sorted_arr.extend([i] * count[i])

    return sorted_arr

用途: 値の範囲が小さい整数(点数、年齢など)

基数ソート

何をするか: 数字を桁ごとに並べ替えます。

def radix_sort(arr):
    max_num = max(arr)
    exp = 1
    while max_num // exp > 0:
        buckets = [[] for _ in range(10)]
        for num in arr:
            buckets[(num // exp) % 10].append(num)
        arr = [num for bucket in buckets for num in bucket]
        exp *= 10
    return arr

用途: 大きな数値やID

バケットソート

何をするか: 値を複数のバケットに分け、それぞれをソートします。

def bucket_sort(arr):
    buckets = [[] for _ in range(len(arr))]
    for num in arr:
        index = int(num * len(arr))
        buckets[index].append(num)
    return [num for bucket in buckets for num in sorted(bucket)]

用途: 均等に分布した小数値

どのソートアルゴリズムを使うべき?

初心者の場合:

  • バブルソート
  • 選択ソート
  • 挿入ソート

データが小さい、またはほぼ整列済み:

  • 挿入ソート
  • シェルソート

データが大きい場合:

  • マージソート
  • クイックソート

パフォーマンスを保証したい場合:

  • ヒープソート
  • イントロソート

特殊な条件がある場合:

  • カウントソート(小さい整数)
  • 基数ソート(桁)
  • バケットソート(均等分布)

実務では:

  • 組み込みのソート関数を使う(Pythonなら sorted()
  • これらは Tim Sort のような最適化されたハイブリッドアルゴリズムを使用しています
sorted_list = sorted([5, 2, 9, 1])

すべてのアルゴリズムを暗記する必要はありません。 大切なのは:

  • どのように動くかを理解すること
  • なぜ速いものと遅いものがあるのかを知ること
  • どの場面で使うべきかを判断できること

ソートの考え方が腑に落ちると、探索、再帰、データ構造といった多くの概念が一気に理解しやすくなります。

この投稿を共有する:

© 2025 MochiiFeed