回 2-2 道 2 データ構造とアルゴリズム
バブルソートは、
読み終えたらデータが
この頁の流れ
3 つの
背の 順に 並べる 手順を、 どう 書けばよいか
背の
体育の
どの
この
バブルソート、 選択ソート、 挿入ソートは どう動くのか
3 つとも、
バブルソートは 隣どうしを 比べて 入れ替える
バブルソートは、
4 つの数 [5, 3, 8, 2] で
- 5 と
3 を 比べ、 逆なので 入れ替えて [3, 5, 8, 2] - 5 と
8 を 比べ、 順なのでそのまま - 8 と
2 を 比べ、 逆なので 入れ替えて [3, 5, 2, 8]。8 が右端に着く
2 周目は
1 周の
選択ソートは 残りから 一番小さい値を選ぶ
選択ソートは、
一番小さい
挿入ソートは 1 つずつ正しい 所に差し込む
挿入ソートは、
差し込む値より
3 つの 違いを 表で比べる
| 見る所 | バブル | 選択 | 挿入 |
|---|---|---|---|
| 比べる | n(n−1)/2 | n(n−1)/2 | n(n−1)/2 |
| 並んだデータ | n − 1 | n(n−1)/2 | n − 1 |
| 入れ替え (最悪) | n(n−1)/2 | n − 1 | n(n−1)/2 |
| 同じ値の順 | 守る | 崩す | 守る |
| 計算量 | O(n²) | O(n²) | O(n²) |
バブルと
動かして確かめる
1 本目は、
動かす 3 つのソートの回数を数える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
件数 バブル 選択 挿入
100 4944 4950 2705
200 19834 19900 9975
400 79745 79800 43712
2 倍にしたときの倍率
100 → 200 4.01 4.02 3.69
200 → 400 4.02 4.01 4.38
入れ替え、ずらした回数
100 2610 92 2610
200 9779 193 9779
400 43317 395 43317比べた
件数を
3 つ目のまとまりでは、
2 本目は、
動かす 並び方で回数が変わる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
並んだ
バブル 99
選択 4950
挿入 99
ほぼ並んだ
バブル 197
選択 4950
挿入 101
逆順
バブル 4950
選択 4950
挿入 4950並んだ
ほとんど
遅い ソートは どこで 崩れるのか
遅い
件数が 10 倍で、 回数は 100 倍
選択ソートの
動かす 件数が増えると比べる回数は
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
10 件 45 回
100 件 4,950 回
1,000 件 499,500 回
10,000 件 49,995,000 回
100,000 件 4,999,950,000 回10 件で
次の
同じ 点数の 人の 順が 入れ替わる
並べる
次の
動かす 同じ点数の順が入れ替わる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
選択
1 上田
2 伊藤
2 青木
挿入
1 上田
2 青木
2 伊藤挿入ソートでは、
「受付の
遅い ソートは 仕事で どう 確かめるのか
仕事では、sorted や sort を
- 並べ替えには
言語の 道具を 使う。 Python の ソートは、 公式文書に よると 安定で、 すでに ある 並びを 生かして 速く並べる - 自分で
書いた 並べ替えは、 sortedの結果と 照らす試験を 書く。 並んだ、 逆の 順、 同じ 値が 混じる、 0 件、 1 件の 5 つの 並びは必ず試す - ループの
中で、 毎回リストの 全部を 見ている 所を 探す。 並べ替えでなくても、 全部と 全部を 比べていれば、 バブルソートと 同じ n(n − 1) / 2 の形になる - 件数を
2 倍に して、 回数か 時間が 約 4 倍に なったら、 n² の形を疑う
遅い
試験で sorted と照らす
def test_matches_sorted():
cases = [[], [1], [1, 2],
[2, 1], [2, 1, 2]]
for a in cases:
got = my_sort(a)
assert got == sorted(a)関わる実例
GTA Online の 読み込みが 6 分かかった (2021年2月28日)
2021年2月28日、
原因は
書き手が
崩れた
出典は How I cut GTA Online loading times by 70% (t0st の
よくある問い
バブルソートの 比較回数は 何回ですか
n 個を
バブルソートの 計算量は いくつですか
最悪と
バブルソートは 安定ですか
安定です。
バブルソートは 実務で 使われますか
そのままのsorted や sort を
3 つの うち、 どれを 覚えれば よいですか
1 つ選ぶなら
確認クイズ
答えだと
1 問目
ばらばらの
2 問目
100 件の
3 問目
受付の
4 問目
このcmp とswp を
比べた回数と入れ替えた回数
a = [2, 1, 4, 3]
cmp = swp = 0
n = len(a)
for e in range(n-1, 0, -1):
for i in range(e):
cmp += 1
if a[i] > a[i+1]:
t = a[i+1]
a[i+1] = a[i]
a[i] = t
swp += 1
print(cmp, swp)説明課題
上の
自分の
この回の 先の一歩
件数が
もっと深く
この
一次資料
どれも
- How I cut GTA Online loading times by 70% (t0st の
ブログ、英語)。2021年2月28日の 公表、 読み込みに 約 6 分、 約 10MB の JSON、 約 63,000 件の 重複の 確かめ、 書き手が 見積もった (n² + n) / 2 の 回数、 直した あと 1 分 50 秒で 約 69.4% 短縮、 重複の 確かめだけを 直すと 4 分 30 秒、 2021年3月15日の 報奨金と 3月16日の直した版 - listsort.txt (CPython の
ソートの 説明書、英語)。Python の ソートが 安定で、 短い列を 二分挿入ソートで 並べ、 短い 区切りを 二分挿入ソートで 伸ばしてから マージすること - Sorting Techniques (Python 公式文書、英語)。Python の
ソートが 安定だと 保証されている こと、 すでに ある 並びを 生かすこと - Getting things sorted in V8 (V8 公式ブログ、英語)。以前の
Array.prototype.sortが長さ 10 より 短い 配列を 挿入ソートで 並べていた こと、 v7.0 と Chrome 70 から 今の 並べ方に なったこと
次へ
道 2 データ構造とアルゴリズムの回
- 2-0アルゴリズムとは順次、
分岐、 反復の 3 つで書く手順頁で読む - 2-1線形探索と二分探索100 万件でも
20 回で見つかる頁で読む - 2-2バブルソートと
挿入・選択ソート遅い ソート 3 つ、 2 倍で 約 4 倍この回 - 2-3クイックソートと
マージソート速い ソート 2 つ、 平均と最悪頁で読む - 2-4スタックとキュー積む順と並ぶ順頁で読む
- 2-5再帰自分を
呼んで 小さくする頁で読む - 2-6木と
二分探索木たどる 順、片寄り頁で読む - 2-7ハッシュテーブル鍵から
一気に 引く、衝突頁で読む - 2-8ダイクストラ法と最短経路点と
線、 幅優先、 重みのある道頁で読む - 2-9動的計画法同じ
計算を 2 度しない頁で読む - 2-10試験と
面接で確かめる基本情報 科目B、 道場 10 問、 面接 20 問頁で読む
