Slide 1

Slide 1 text

ソート アルゴリズム 2019/01/11 AIメディカル研究会@阪大吹田キャンパス yukikogamo / @ykringum

Slide 2

Slide 2 text

自己紹介 阪大 「ワニ博士」 外国語学部の頃 阪大 「ワニ博士」 基礎工学部の頃

Slide 3

Slide 3 text

アルゴリズム ⚫与えられたデータから望みの情報を 取り出すための操作手順

Slide 4

Slide 4 text

ソーティング ⚫整数や浮動小数点など大小関係を考えることが可能な要素の 集合に対し、小さいものから、あるいは大きなものから順に その集合内の要素を並び替えること ⚫計算機を用いて行う処理の中で最も基本的なもののひとつ

Slide 5

Slide 5 text

ソーティング ⚫バブルソート ⚫選択ソート ⚫挿入ソート ⚫クイックソート ⚫マージソート ⚫バケットソート(基数ソート) など

Slide 6

Slide 6 text

バブルソート(計算時間:O(n^2)) ⚫単純なソート法のひとつ。隣同士の要素をすべて比較し交換する、という ことをそのような組み合わせがなくなるまで繰り返す array[i]とarray[i+1]との比較・入れ替えをi=0からn-1まで 行い、これをn回行えばソートされる

Slide 7

Slide 7 text

選択ソート(計算時間:O(n^2)) ⚫単純なソートのひとつ。バブルソートを改変したアルゴリズム。 配列の中から「残っているもののうち1番小さいものを前に 持って来る」を繰り返す

Slide 8

Slide 8 text

挿入ソート(計算時間:O(n^2)) この場合は7だが、最初に選ぶ 要素を pivot という

Slide 9

Slide 9 text

クイックソート(計算時間:O(n^2)) ⚫挿入ソートの手法を再帰的におこなう。ある値を定めた後、 その値より大きい値と小さい値で数列を2つに分け、それを再 帰的に解く

Slide 10

Slide 10 text

マージソート(計算時間:O(nlogn)) ⚫配列をふたつに分けてそれぞれをソートしそれらをマージする、 ということを再帰的に繰り返していく ⚫全体を分割する回数は O(logn)。1 回のステップのマージ処理 は O(n) の計算時間がかかるため、このアルゴリズムの最悪 計算時間は O(nlogn) となる

Slide 11

Slide 11 text

バケットソート(計算時間:O(n+c)) ⚫配列の要素が正の整数かつ上限が十分小さな定数 c で抑えられ る場合、 c 個の空のリストからなる配列を用意し、以下の処理 をおこなう num[i] := 配列 c の中に数値 i が何個あったか これを配列全体に for 文で回す

Slide 12

Slide 12 text

時間複雑度 ⚫O(1):非常に速い ⚫O(logn):非常に速い ⚫O(n):これも速い ⚫O(nlogn):速いといってよい ⚫O(n^2):かなり遅い ⚫O(n^3):遅すぎて実用にならない ⚫O(c^n):(cは1より大きい定数) 遅すぎてもはやアルゴリズムと呼べない

Slide 13

Slide 13 text

競プロ

Slide 14

Slide 14 text

競プロ 1. #include 2. #include 3. #include 4. using namespace std; 5. int N, a[109]; 6. int main() { 7. cin >> N; 8. for (int i = 0; i < N; i++) cin >> a[i]; 9. sort(a, a + N, greater()); 10. int ret = 0; 11. for (int i = 0; i < N; i++) ret += a[i] * (i & 1 ? -1 : 1); 12. cout << ret << endl; 13. return 0; 14. } C++ は STL の を入れれば std::sort() が使える。 C 言語だと関数ポインタで qsortを使う

Slide 15

Slide 15 text

おすすめ アルゴリズム図鑑

Slide 16

Slide 16 text

参考 ⚫ 『情報工学 アルゴリズム』(東京大学工学教程編纂委員会) ⚫ 『データ構造とアルゴリズム』(共立出版) ⚫ ソートを極める! 〜 なぜソートを学ぶのか 〜 ⚫ 競プロのめっちゃ初歩的思考法 ⚫ ソーティングと貪欲法 ⚫ 競技プログラミングWiki ⚫ 【Unity】ソートアルゴリズム12種を可視化してみた ⚫ AtCoder Beginner Contest 088:B - Card Game for Two