Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 35 additions & 7 deletions docs/02advanced/08sort/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Answer from "@site/src/components/Answer";

今回は、ソートについて見ていきます。

ソートは、データを順番に並べることです。日本語では、整列、並べ替えなどと呼ばれます。例えば、次のように数字を順番に並べ替えたり、名前を名前の順に並び替えることもソートです。
ソートは、データを順番に並び替えることです。日本語では、整列、並べ替えなどと呼ばれます。例えば、次のように数字を順番に並べ替えたり、名前を名前の順に並び替えることもソートです。

![ex1](sort-ex1.drawio.svg)

Expand Down Expand Up @@ -55,9 +55,11 @@ import Answer from "@site/src/components/Answer";

![bubble sort step6](bubble-sort6.drawio.svg)

これで、完全に並び替えられました。

これを一般化すると、次のようになります。
はじめは、一番目の要素と二番目の要素を比較して入れ替えます。つぎは一番目と三番目、さらにつぎは一番目と四番目、…、一番目と n 番目と比較して入れ替えていきます。
その後、二番目と三番目、二番目と四番目、…、二番目と n 番目と入れ替えていきます。これを n-1 番目と n 番目まで繰り返していけば、ソートできます。
その後、二番目と三番目、二番目と四番目、…、二番目と n 番目と入れ替えていきます。さらに、これを n-1 番目と n 番目まで繰り返していけば、ソートできます。

### バブルソートのプログラム

Expand All @@ -77,24 +79,30 @@ import Answer from "@site/src/components/Answer";

### マージソートとは

マージソートは、アルゴリズム自体はバブルソートより複雑ですが非常に効率の良いアルゴリズムです。バブルソートのオーダーが、$O(n^2)$ であったのに対して、マージソートのオーダーは $O(n\log n)$ です。併合整列法と呼ばれることもあるようです。
マージソートは、アルゴリズム自体はバブルソートより複雑ですが非常に効率の良いアルゴリズムです。バブルソートのオーダーが、$O(n^2)$ であったのに対して、マージソートのオーダーは $O(n\log n)$ です。非常に速いですね。併合整列法と呼ばれることもあるようです。

### マージソートのアルゴリズム

基本的な流れとしては、次のようになります。
基本的な流れとしては、次のようになります。以下を再帰的に行えばソートできます。

1. データ列を二分割する。
1. それぞれのデータ列をソートする。
1. ソートされた 2 つのデータをマージする。

まずは、データ列を二分割することを繰り返します。
実際に、簡単な例を見てみましょう。

まずは、データ列を二分割することを繰り返していきます。

![merge sort step1](merge-sort1.drawio.svg)

次に、分割した要素を並べ替えながら戻していきます。
次に、分割した要素を並べ替えながら戻していきます。まずは、バラバラの要素を二つずつの組に戻していきます。この時、並び替えも行います。

![merge sort step2](merge-sort2.drawio.svg)

次に、二つずつの組をさらに戻していきます。

![merge sort step3](merge-sort3.drawio.svg)

### マージソートのプログラム

マージソートのプログラムを作ってみましょう。
Expand All @@ -107,6 +115,10 @@ import Answer from "@site/src/components/Answer";

<ViewSource path="/sort/merge_sort.ipynb" />

`+` 演算子を用いることで二つの配列を一つに結合することができます。

`a[i:j]` とすることで、配列 `a` の `i` 番目から `j - 1` 番目の要素を取り出すことができます。ちなみに、開始インデックスや終了インデックスは省略することもできます。

### 練習問題

マージソートを用いて、データを降順に並び替える関数を作ってみましょう。
Expand All @@ -123,16 +135,32 @@ Python にはソートをする関数が備わっています。`sort` と `sort

次のようにすることで、配列のデータをソートすることができます。

<ViewSource path="/sort/sort.ipynb" />

### `sorted`

`sorted` 関数は、要素を並び替えた配列を返します。

<ViewSource path="/sort/sorted.ipynb" />

:::info

実は、ここで紹介した以外にもたくさんのソートアルゴリズムがあります。

バブルソート、マージソートの他に、クイックソートや選択ソート、挿入ソート、ヒープソート、バケットソートなどがあります。

他にも、非常に効率の悪いソートアルゴリズムとして、ボゴソートが知られています。ボゴソートは、ソートが完了するまで配列の中身をランダムにシャッフルすることを繰り返すというものです(笑)
他にも、非常に効率の悪いソートアルゴリズムとして、ボゴソートが知られています。ボゴソートは、ソートが完了するまで配列の中身をランダムにシャッフルすることを繰り返すというものです。いつになったら、ソートが完了するのでしょう(笑)

<iframe
width="100%"
style={{ aspectRatio: "16/9" }}
src="https://www.youtube.com/embed/kPRA0W1kECg"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>

これは、昔に話題になった動画です。いろいろなソートアルゴリズムを視覚的にわかりやすく比較しています。最後のソートアルゴリズムは必見です。

:::
Loading