基本情報技術概論 I (第6回) アルゴリズム と データ構造 埼玉大学 理工学研究科 堀山 貴史 1 ソート アルゴリズム 計算量 基礎的なもの バブルソート (隣と交換) 選択ソート (最小値 or 最大値 を選択) 挿入ソート (未ソートの値を1つずつ挿入) 少し高速なもの 高速なもの O(n2) 単純な実装 O(n2) シェルソート (挿入ソートの改良版) もう少し速くできる クイックソート (交換で、基準値より 小さい値/大きい値に分ける) ヒープソート マージソート (ソート済リストをマージ) 最悪 O(n2) 平均 O(n log n) O(n log n) 2 基礎的なソートアルゴリズム 3 バブルソート (隣接交換法) 隣り合う値を見比べて、大小関係が逆なら交換 小 大 小 が バ ラ 大 バ ラ 20 30 5 10 1 20 30 5 見比べて 1 交換 10 1 20 30 5 10 1 20 5 30 10 20 30 1 5 10 1 確定 20 バ 30 ラ バ 5 ラ 10 20 1 30 5 10 1 5 確定 20 バ ラ 30 バ 10 ラ … 4 バブルソート n個 比較回数 n (n – 1) / 2 交換回数 最悪 n (n – 1) / 2 (隣接交換法) 計算量 1 20 30 5 10 確定 1 5 20 30 10 1 確定 5 10 20 30 1個目を確定させるのに 2個目 比較が n – 1 回 n–2回 確定 … 1 5 10 20 30 3個目 … n - 1 個目 n–3回 … 1回 全部で O( n2 ) 5 バブルソート 開始 n→k (隣接交換法) 繰返し 1 20 30 5 10 k≦1 確定 1→i T( i+1) → w T( i ) → T( i+1) w → T( i ) 交 換 i=k > T(i), T(i+1) を交換 T(i):T(i+1) ≦ i+1→i 1 5 20 30 10 確定 交 換 k-1→k 繰返し 終了 6 比較回数 n (n – 1) / 2 交換回数 最悪 n - 1 選択ソート 小 ソ ー ト 範 囲 大 ソ ー ト 範 囲 最小値 (or 最大値) を選択し、ソート範囲の先頭へ 20 30 5 10 1 最小値 の候補 比較 1 確定 最小値 30 の候補 5 10 20 20 30 5 10 1 1 30 5 10 20 最小値 の候補 最小値 の候補 20 30 5 10 1 20 30 5 10 1 交換 最小値 交換 最小値 7 比較回数 最悪 n (n – 1) / 2 交換回数 最悪 n (n – 1) / 2 挿入ソート 小 大 未 ソ ー ト 未ソートの値を挿入 20 30 5 10 1 5 20 30 10 1 挿入 10 挿入 20 30 5 10 1 5 20 30 1 5 挿入 10 挿入 20 30 10 1 5 10 20 30 1 5 挿入 1 挿入 8 高速なソートアルゴリズム 9 マージソート ソートされた2つの列 → 1つにマージ(併合)するのは簡単 (各列の先頭を見比べながら、小さい方を取っていく) 5 20 25 50 (併合ソート) 1 10 30 40 1回のマージの実行時間は、要素数に比例 10 マージソート (併合ソート) 5 25 50 20 30 40 10 1 5 25 50 20 5 25 5 25 5 25 30 40 10 1 50 20 50 20 20 50 30 40 30 40 30 40 分割 10 1 10 log n 段 1 1 10 マージ log n 段 1 段に O( n ) 時間 → 全部で O( n log n ) 時間 クイックソート 5 25 50 20 30 40 10 1 基準値 は 20 (基準値の決め方は色々) 5 25 50 20 30 40 10 1 基準値 以上 5 基準値 以下 基準値 以上の値を左から 以下の値を右から 探して、交換 1 50 20 30 40 10 25 基準値 以上 5 交換 真ん中の位置の 値が基準値 交換 基準値 以下 1 10 20 30 40 50 25 基準値 以上 基準値 以下 12 クイックソート 基準値以下 5 基準値以上 1 10 20 30 40 50 25 基準値 以上 クイックソート 再帰的に クイックソート 基準値 以下 クイックソート ※ 基準値以上、基準値以下が、半分ずつの大きさに 分かれる保証は無い (大きさが偏ることもある) 13 シェルソート k = n/2 離れた要素の部分列を挿入ソート 5 25 50 20 30 40 10 1 5 25 50 20 30 40 10 1 5 25 50 20 30 40 10 1 5 25 10 20 30 40 50 1 5 25 10 1 30 40 50 20 14 シェルソート k = n/4 離れた要素の部分列を挿入ソート 5 25 10 1 30 40 50 20 5 25 10 1 30 40 50 20 5 1 10 20 30 25 50 40 ※ 25, 40 や 1, 20 はソートされているので、 25, 1, 40, 20 の挿入ソートは、 要素数4の一般の挿入ソートよりも 最悪の比較・交換回数が少なくて済む 15 シェルソート k = n/8 離れた要素の部分列を挿入ソート 5 1 10 20 30 25 50 40 1 5 10 20 25 30 40 50 ある間隔で要素を取り出した部分列をソートし、 さらに間隔をつめた部分列を取り出してソートする 16 前回の復習: ヒープソート ヒープの最大値の取り出し、ヒープの維持を繰り返す 7 1 6 5 6 3 2 4 1 最大値の取り出し 5 6 3 2 4 1 7 最後の葉の移動 3 7 2 4 ヒープの維持 4 6 3 5 5 7 1 2 4 最大値の取り出し 3 5 67 1 2 4 最後の葉の移動 3 1 5 67 2 ヒープの維持 17 前回の復習: ヒープソート ヒープの最大値の取り出し、ヒープの維持を繰り返す 7 6 1 5 6 3 2 4 1 最大値の取り出し 計算量 O( 1 ) 3 5 7 2 4 ヒープの維持 計算量 O( log n ) n 回 繰り返し … トータルの計算量 O( n log n ) 18 19 20 選択ソート 20 30 5 10 1 最大値 の候補 比較 (演習 2-02) 20 30 5 10 1 最大値を選択して、 大きい順にソートする 開始 交換 i = 1, 2, ..., n-1 最大値 の候補 i→k 最大値 j = i+1, i+2, ..., n > j→k X(j):X(k) ≦ 最大値 X(k), X(j) を交換 交 換 終了 21 22 23 この教材のご利用について この文面は、TOKYO TECH OCW の利用 条件を参考にしました この教材は、以下に示す利用条件の下で、著作権者にわざわざ許諾を 求めることなく、無償で自由にご利用いただけます。講義、自主学習は もちろん、翻訳、改変、再配布等を含めて自由にご利用ください。 非商業利用に限定 この教材は、翻訳や改変等を加えたものも含めて、著作権者の許 諾を受けずに商業目的で利用することは、許可されていません。 著作権の帰属 この教材および教材中の図の著作権は、次ページ以降に示す著 作者に帰属します。この教材、または翻訳や改変等を加えたもの を公開される場合には、「本教材 (or 本資料) は http://www.al.ics. saitama-u.ac.jp/horiyama/OCW/ の教材です (or 教材を改変したものです」 との旨の著作権表示を明確に実施 してください。なお、この教材に改変等を加えたものの著作権は、 次ページ以降に示す著作者および改変等を加えた方に帰属しま す。 同一条件での頒布・再頒布 この教材、または翻訳や改変等を加えたものを頒布・再頒布する 場合には、頒布・再頒布の形態を問わず、このページの利用条件24 この教材のご利用について 配布場所 http://www.al.ics.saitama-u.ac.jp/horiyama/OCW/ この powerpoint ファイルの著作者 堀山 貴史 2007-2011 [email protected] 改変等を加えられた場合は、お名前等を追加してください 図の著作者 p. 4, 8 クリップアート : Microsoft Office Online / クリップアート その他 堀山 貴史 25
© Copyright 2024 ExpyDoc