ふくふくHukuhuku Inc.
EP.09CS Basics対象: 中2以上 10分公開: 2026-05-10

アルゴリズムの基礎:探索・ソートと計算量

線形探索 vs 二分探索、バブルソート vs クイックソート vs マージソート。同じ「探す」「並べる」でも、賢い手順を選べば数千倍速くなる。計算量と実装パターンを Python で見る。

#アルゴリズム#ソート#探索#計算量
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

同じ問題を解くにも、賢い手順 (アルゴリズム) を選べば 1000 倍速くなる。本記事では「探す」「並べる」という基本タスクを通じて、アルゴリズム的思考の基礎を扱います。

1. 計算量の感覚

計算量n=100n=1 万n=1 億
O(1)1 ステップ1 ステップ1 ステップ
O(log n)71327
O(n)1001 万1 億
O(n log n)66413 万27 億
O(n²)1 万1 億1 京 (= 10^16)
O(2^n)(計算不能)

2. 探索アルゴリズム

2-1. 線形探索 (O(n))

未ソートのデータから探す
Python
def linear_search(data, target):    for i, v in enumerate(data):        if v == target:            return i    return -1
print(linear_search([3, 1, 4, 1, 5, 9, 2, 6], 5))  # 4

2-2. 二分探索 (O(log n))

ソート済みデータから探す
Python
def binary_search(sorted_data, target):    low, high = 0, len(sorted_data) - 1    while low <= high:        mid = (low + high) // 2        if sorted_data[mid] == target:            return mid        elif sorted_data[mid] < target:            low = mid + 1        else:            high = mid - 1    return -1
# Python 標準ライブラリでも同じことができるimport bisectsorted_data = [1, 1, 2, 3, 4, 5, 6, 9]print(bisect.bisect_left(sorted_data, 5))  # 5 が入る位置

3. ソートアルゴリズム

3-1. バブルソート (O(n²)) — 教科書用

シンプルだが遅い
Python
def bubble_sort(data):    n = len(data)    for i in range(n):        for j in range(0, n - i - 1):            if data[j] > data[j + 1]:                data[j], data[j + 1] = data[j + 1], data[j]    return data

3-2. クイックソート (平均 O(n log n))

実用最速級、ただし最悪 O(n²)
Python
def quicksort(data):    if len(data) <= 1:        return data    pivot = data[len(data) // 2]    left = [x for x in data if x < pivot]    middle = [x for x in data if x == pivot]    right = [x for x in data if x > pivot]    return quicksort(left) + middle + quicksort(right)

3-3. Python 標準 sorted (Timsort)

実用上はこれを使う
Python
# Python の sort は Timsort (マージソート + 挿入ソートのハイブリッド)data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]print(sorted(data))  # 標準。最悪 O(n log n) 保証data.sort()          # in-place ソート
# キー指定people = [{'name': 'A', 'age': 30}, {'name': 'B', 'age': 25}]print(sorted(people, key=lambda p: p['age']))

4. ソートアルゴリズム比較

アルゴリズム平均最悪メモリ安定性
バブルO(n²)O(n²)O(1)安定
選択O(n²)O(n²)O(1)不安定
挿入O(n²)O(n²)O(1)安定
マージO(n log n)O(n log n)O(n)安定
クイックO(n log n)O(n²)O(log n)不安定
ヒープO(n log n)O(n log n)O(1)不安定
TimsortO(n log n)O(n log n)O(n)安定

5. 次の話

EP.10 では 暗号と認証 に進みます。HTTPS の中身、共通鍵暗号と公開鍵暗号、ハッシュ関数の使われ方を見ます。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp