プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort

Slides:



Advertisements
Similar presentations
4.3 マージソート.
Advertisements

4.ソート問題とアルゴリズム 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
離散システム特論 整列(sorting)アルゴリズム 2.
アルゴリズムイントロダクション第2章 主にソートに関して
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
第12回 ソート(3): シェルソート、クイックソート
高速ソートと 安定結婚問題 平成24年12月14日.
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造1 2005年7月8日
2009/10/30 整列アルゴリズム (2) 第5講: 平成21年10月30日 (金) 4限 E252教室 コンピュータアルゴリズム.
第7講: 平成19年11月2日 (金) 4限 E252教室 クイックソートと オーダー記法.
算法数理工学 第1回 定兼 邦彦.
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
プログラミング序論演習.
4.整列のアルゴリズム.
プログラミング論 I 関数の再帰呼び出し
アルゴリズムとデータ構造 --- 理論編 --- 山本 真基
第10回 ソート(1):単純なソートアルゴリズム
情報処理Ⅱ 2005年12月9日(金).
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
アルゴリズム入門.
第11回 整列 ~ シェルソート,クイックソート ~
算法数理工学 第1回 定兼 邦彦.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
2009/11/6 整列アルゴリズムの復習 第6講: 平成21年11月6日 (金) 4限 E252教室 コンピュータアルゴリズム.
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
2011/06/21 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
データ構造と アルゴリズム第4回 知能情報学メジャー 和田俊和.
ソートアルゴリズムの種類 選択ソート (selection sort) バブルソート (bubble sort)
プログラミング2 関数の再帰呼び出し
2011/06/21-24 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズム入門.
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
クイックソート.
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
第5回放送授業.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとプログラミング (Algorithms and Programming)
復習その1+α JBuilderの使い方を思い出す。 配列とGUI
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
オブジェクト指向プログラミングと開発環境
再帰的手続き.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
データ構造とアルゴリズム (第3回) 静岡大学工学部 安藤和敏
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2013年7月1日
C#プログラミング実習 第2回.
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
アルゴリズムとデータ構造 2012年6月25日
プログラミング2 関数の再帰呼び出し
プログラミング演習I 2003年6月11日(第9回) 木村巌.
4.2 再帰下降解析 (1)再帰下降解析とは ■再帰下降解析(Recursive Descent Parsing)
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort P. Ravindra S. De Silva e-Mail: ravi@cs.tut.ac.jp, Room F-413 URL: www.icd.cs.tut.ac.jp/~ravi/prog3/index_j.html 1

クイックソート

クイックソート クイックソートは配列中の適当な値(これをピボットと呼ぶ;データ総数の中央値が望ましい)を使用して、この基準値より大きいか小さいかによって二分割しながら並び変えてゆくアルゴリズム 分割: 適当な配列要素 p を ピボット として選択する 例, 一番目の配列要素 残りの要素を次のように配分する FirstPart,    < p (p未満の値をもつ要素) SecondPart,  ≥ p (p以上の値をもつ要素) FirstPart と SecondPart を 再帰的に並び変える 結合: ソートが適切に終了するまで何もしなくてよい

p p p >= x x < p x < p p p >= x A: ピボット 分配 再帰呼び出し クイックソート FirstPart SecondPart p p >= x x < p 再帰呼び出し x < p p p >= x ソート済 FirstPart SecondPart ソート済

クイックソート Quick-Sort(A, left, right) if left ≥ right return else middle ← Partition(A, left, right) Quick-Sort(A, left, middle–1 ) Quick-Sort(A, middle+1, right) end if

Partition(A, left, right) x ← A[left] i ← left for j ← left+1 to right if A[j] < x then i ← i + 1 swap(A[i], A[j]) end if end for j swap(A[i], A[left]) return i

分配の例 i=0 A: 4 8 6 3 5 1 7 2 j=1

分配の例 i=0 A: 4 8 8 6 3 5 1 7 2 j=1

分配の例 i=0 A: 4 8 6 6 3 5 1 7 2 j=2

分配の例 i=1 i=0 A: 4 8 3 8 6 3 3 5 1 7 2 j=3

分配の例 i=1 A: 4 3 6 8 5 5 1 7 2 j=4

分配の例 i=1 A: 4 3 6 8 5 1 1 7 2 j=5

分配の例 i=2 A: 4 3 6 1 6 8 5 1 7 2 j=5

分配の例 i=2 A: 4 3 1 8 5 6 7 7 2 j=6

分配の例 i=2 i=3 A: 4 3 1 8 2 5 6 7 8 2 2 j=7

分配の例 i=3 A: 4 3 1 2 5 6 7 8 j=8

分配の例 i=3 A: 4 2 3 1 2 4 5 6 7 8

分配の例 適切な位置に ピボットが配置された A: 2 3 1 4 5 6 7 8 x < 4 4 >= x

Quick-Sort(A, 0, 7) Partition A: 4 8 6 3 5 1 7 2 2 3 1 5 6 7 8 4

Quick-Sort(A, 0, 7) Quick-Sort(A, 0, 2) , partition A: 4 5 6 7 8 2 3 1 5 6 7 8 2 3 1 2 1 3

Quick-Sort(A, 0, 7) Quick-Sort(A, 0, 0) , return , base case 4 5 6 7 8 5 6 7 8 1 2 3 1

Quick-Sort(A, 0, 7) Quick-Sort(A, 1, 1) , base case 4 5 6 7 8 1 2 3

Quick-Sort(A, 0, 7) Quick-Sort(A, 0, 2), return 1 3 4 5 6 7 8 2 1 3

Quick-Sort(A, 0, 7) Quick-Sort(A, 4, 7) Quick-Sort(A, 2, 2), return , partition 2 1 3 4 5 6 7 8 6 7 8 5

Quick-Sort(A, 0, 7) Quick-Sort(A, 5, 7) , partition 2 1 3 4 5 6 7 8 6 6 7 8 6 7 8 6

Quick-Sort(A, 0, 7) Quick-Sort(A, 6, 7) , partition 2 1 3 4 5 6 7 8 7 7 8 7 8

Quick-Sort(A, 0, 7) Quick-Sort(A, 7, 7) , base case , return 2 1 3 4 5 6 7 8 8

Quick-Sort(A, 0, 7) Quick-Sort(A, 6, 7) , return 2 1 3 4 5 6 7 8

Quick-Sort(A, 0, 7) Quick-Sort(A, 5, 7) , return 2 1 3 4 5 6 8 7

Quick-Sort(A, 0, 7) Quick-Sort(A, 4, 7) , return 2 1 3 4 5 6 8 7

Quick-Sort(A, 0, 7) Quick-Sort(A, 0, 7) , done! 2 1 3 4 5 6 8 7

マージソート

A ソート完了! マージソートの概念 二分割する 再帰的に 並び変える マージ(合併) FirstPart SecondPart

A: 結合 配分の仕方 A[middle] A[left] ソート済 FirstPart ソート済 SecondPart A[right] 均衡のとれた配分を達成したい データをAとBに二等分する 再帰的にAとBをソートする 二つの配列を一つに結合するmerge処理を呼び出して、AとBの配列を結合する A[middle] A[left] ソート済 FirstPart ソート済 SecondPart A[right] 結合 A: ソート済

Merge-Sort (A, left, right) if left ≥ right return else マージソート: アルゴリズム Merge-Sort (A, left, right) if left ≥ right return else middle ← b(left+right)/2 Merge-Sort(A, left, middle) Merge-Sort(A, middle+1, right) Merge(A, left, middle, right) 再帰呼び出し

Example n/2のサイズでリストを分割する [10, 4, 6, 3, 8, 2, 5, 7] [10, 4, 6, 3] [8, 2, 5, 7] [10, 4] [6, 3] [8, 2] [5, 7] [4] [10] [3][6] [2][8] [5][7]

Example Cont’d 結合 [2, 3, 4, 5, 6, 7, 8, 10 ] [3, 4, 6, 10] [2, 5, 7, 8] [4, 10] [3, 6] [2, 8] [5, 7] [4] [10] [3][6] [2][8] [5][7]

マージソート: 結合例 A: 2 3 7 8 5 15 28 30 6 10 14 1 4 5 6 6 10 14 22 3 5 15 28 L: R: 一時的な保存に用意した配列要素 P. E. S. S. De Silva 8470013681

マージソート: 結合例 A: 1 3 5 15 28 30 6 10 14 k=0 L: R: 3 2 15 3 7 28 8 30 6 1 4 10 14 5 22 6 i=0 j=0

マージソート: 結合例 A: 1 2 5 15 28 30 6 10 14 k=1 L: R: 3 2 5 3 7 15 8 28 1 6 4 10 14 5 22 6 i=0 j=1

マージソート: 結合例 A: 1 2 15 3 28 30 6 10 14 k=2 L: R: 2 3 7 8 6 1 4 10 5 14 22 6 i=1 j=1

マージソート: 結合例 A: 1 2 3 4 6 10 14 k=3 L: R: 2 3 7 8 6 1 10 4 14 5 22 6 i=2 j=1

マージソート: 結合例 A: 1 2 3 4 5 6 10 14 k=4 L: R: 2 3 7 8 1 6 10 4 14 5 22 6 i=2 j=2

マージソート: 結合例 A: 1 2 3 4 5 6 6 10 14 k=5 L: R: 2 3 7 8 6 1 10 4 5 14 6 22 i=2 j=3

マージソート: 結合例 A: 1 2 3 4 5 6 7 14 k=6 L: R: 2 3 7 8 6 1 10 4 14 5 6 22 i=2 j=4

マージソート: 結合例 A: 1 2 3 4 5 6 7 8 14 k=7 L: R: 2 3 3 5 7 15 8 28 1 6 10 4 14 5 22 6 i=3 j=4

マージソート: 結合例 A: 1 2 3 4 5 6 7 8 k=8 L: R: 2 3 3 5 7 15 8 28 6 1 4 10 14 5 6 22 j=4 i=4

Merge(A, left, middle, right) n1 ← middle – left + 1 n2 ← right – middle create array L[n1], R[n2] for i ← 0 to n1-1 do L[i] ← A[left +i] for j ← 0 to n2-1 do R[j] ← A[middle+j] k ← i ← j ← 0 while i < n1 & j < n2 if L[i] < R[j] A[k++] ← L[i++] else A[k++] ← R[j++] while i < n1 while j < n2