docs(ja): add insertion sort (#771)

Co-authored-by: My Name <my-name@chromium.org>
pull/774/head
nohno23 2022-07-03 18:29:41 -07:00 committed by GitHub
parent fee85368ba
commit f1debdc7c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 0 deletions

View File

@ -3,6 +3,7 @@
## ソート
- [バブルソート](./Sorting/Bubble-Sort.md)
- [挿入ソート](./Sorting/Insertion-Sort.md)
## 文字列
- [回文](./Strings/Palindrome.md)

View File

@ -0,0 +1,66 @@
# 挿入ソート 
基本挿入法とも呼ばれる挿入ソートは、シンプルで実装が容易であり、最も安定しているソートアルゴリズムである。数値が正しい場所にない場合に、その数値を正しい位置に挿入する。平均、最悪計算量は共にO(n^2)である。
挿入ソートを高速化したものとしてシェルソートがある。
## ステップ
1. 0番目の要素と1番目の要素を比較する。
2. 0番目の要素が1番目の要素より大きい場合、要素を入れ替える。
3. 2番目の要素と1つ前の要素を比較する。
4. 2番目の要素が1つ前の要素より大きい場合、要素を入れ替える。
5. 2番目の要素が正しい位置に来るまで2.と4.を実行する。
6. ソートが完了するまで3.から5.を何度も繰り返す。
## 例
初期配列
**1 4 3 9 5**
ソート後配列
**1 3 4 5 9**
ステップ
**1回目**
- ( **1 4** 3 9 5 ) → ( **1 4** 3 9 5 ), ここでアルゴリズムは最初の2つの要素を比較し、順番通りのため(4 > 1), アルゴリズムは入れ替えをしない。
**2回目**
- ( 1 **4 3** 9 5 ) → ( 1 **3 4** 9 5 ), 4 > 3なので入れ替える。
- ( **1 3** 4 9 5 ) → ( **1 3** 4 9 5 )
ここで選択した要素が1つ前の要素よりも大きいため、アルゴリズムは選択した要素の次の要素に移る。(この配列の場合は3の次である4)
**3回目**
- ( 1 **3 4** 9 5 ) → ( 1 **3 4** 9 5 )
**4回目**
- ( 1 3 **4 9** 5 ) → ( 1 3 **4 9** 5 )
**5回目**
- ( 1 3 4 **9 5** ) → ( 1 3 4 **5 9** )
- ( 1 3 **4 5** 9) → ( 1 3 **4 5** 9 )
さて、この時点で配列はすでにソートされたが、まだ配列の最後の要素にたどり着いていない。アルゴリズムは配列の最後の要素を選択するまで続く。
**6回目**
- ( 1 3 4 **5 9** ) → ( 1 3 4 **5 9** )
## 実装
- [C](../../../algorithms/C/sorting/insertion-sort.c)
- [C++](../../../algorithms/CPlusPlus/Sorting/insertion-sort.cpp)
- [CSharp](../../../algorithms/CSharp/src/Sorts/insertion-sort.cs)
- [Go](../../../algorithms/Go/sorting/insertion-sort.go)
- [Java](../../../algorithms/Java/sorting/insertion-sort.java)
- [JavaScript](../../../algorithms/JavaScript/src/sorting/insertion-sort.js)
## 動画のURL
[Youtube Video about Insertion Sort](https://www.youtube.com/watch?v=i-SKeOcBwko)
## その他
[Wikipedia](https://en.wikipedia.org/wiki/Insertion_sort)