Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ソートアルゴリズム101/Sorting Algorithms 101

akht
August 24, 2018

ソートアルゴリズム101/Sorting Algorithms 101

akht

August 24, 2018
Tweet

More Decks by akht

Other Decks in Programming

Transcript

  1. 自己紹介 池田 昭仁 ( いけだ あきひと) @akht_ikd 鹿児島市内でSE( プログラマ...?) 3

    年目になりました 趣味 自転車( 最近乗ってない) 野球( ほとんどやってない) 2
  2. ソートとは? ソート (sort) は、データの集合を一定の規則に従 って並べること。日本語では整列(せいれつ)と 訳される。(以前はその原義から分類という訳語 が充てられていた)[1] ) 主にコンピュータソフトにおけるリストに表示す るデータに対し、全順序関係によって一列に並べ

    ることを指す。また、単に「ソート」といった場 合、値の小さい方から大きい方へ順に並べる昇順 (しょうじゅん、ascending order )を指すことが 多い。その反対に値を大きい方から小さい方へ順 に並べることを降順(こうじゅん、descending order )という。 “ 3
  3. 7

  4. バブルソート 動き 5 3 1 2 4 という配列を昇順に整列させる 1. まず先頭から2つに着目し、並べる

    5 と3 は順序が逆転しているので入れ替える この時点で3 5 1 2 4 になる 2. その次の2つに着目し、並べる 5 と1 は順序が逆転しているので入れ替える この時点で3 1 5 2 4 になる 3. 同様に繰り返す 11
  5. 12

  6. バブルソート 計算量 一回のスキャンでひとつずつ位置が確定していく つまり要素数がn 個のとき、 最初はn − 1 回の比較(最大値の位置が確定) 次はn

    − 2 回の比較(次に大きい値の位置が確定) ・・・ 最後の1 回の比較(全ての並びが確定) となるので、 比較回数は1 + 2 + ... + (n − 1)= 回になる よって計算量は O(n ) ということになる ※最大次数の項だけ残す 2 n(n−1) 2 13
  7. 挿入ソート 動き 2 9 7 4 を昇順に整列させる 1. 2つ目の9 を選んで、それより前の要素を比べる

    大きいものはないので次の要素に移る2 9 7 4 2. 7 を選んで、それより前の要素と比べる(7 はp とし て覚えておく) 9 は7 より大きいのでひとつずらす2 _ 9 4 2 は7 より小さいのでここで走査は終了。空いた 場所に7 を入れる2 7 9 4 3. 同様に繰り返す 17
  8. 18

  9. 挿入ソート 計算量 各要素について自分より前の要素と比較していく 1 つ目の要素は1 回の比較、その次は2 回の比較... とな っていく( 最悪時)

    平均するとその半分なので、 + + + ... + = になる よって計算量は O(n ) ということになる 2 1 2 2 2 3 2 n−1 4 n(n−1) 2 19
  10. マージソート 考え方 ソートをどうするか? 前ページで示した手順を行う関数 mergesort() を 再帰的に呼び出す マージ処理の手順 ソート済みの配列A, B

    をマージして配列C を作るとき 「A, B のそれぞれ先頭の要素を比べて小さい方をC の 末尾に追加する」という手順を繰り返す 23
  11. 24

  12. マージソート 計算量 ※ざっくり 分割とマージにはそれぞれO(logn) かかる 分割は4 -> 2 -> 1

    と毎回半分になり マージは1 -> 2 -> 4 と毎回2 倍になるため 各マージにはそれぞれO(n) かかる よって全体ではO(nlogn) かかることになる 25
  13. 29

  14. 30

  15. 31

  16. 32

  17. 33

  18. 34

  19. 35

  20. 36

  21. 37

  22. 38

  23. クイックソート 平均計算量: O(nlogn) 最悪計算量: O(n ) 考え方: 軸( ピボット) を選びそれより小さいものと大きいもの

    にわける わかれた2つに対して再帰的に同じことを繰り返す 分割統治法によるアルゴリズム 実用上もっとも高速といわれる 2 41
  24. 43

  25. クイックソート 実装 2つに分割する処理の実装方法としては以下のような ものがある 左から順に値を調べ、ピボットより大きいなもの を見つける(i 位置) 右から順に値を調べ、ピボットより小さなものを 見つける(j 位置)

    i <= j なら、その2つの値を交換する i+1 、j-1( それぞれひとつ進めた位置) から再び値を 調べていく i とj がクロスしたら、i の左側を境界として分割する 44