実務経験のある教員による授業科目一覧 · 第13講~第18講 アルゴリズムとプログラミングⅡ(アルゴリズム) 第19講~第24講 アルゴリズムとプログラミングⅢ(プログラミング)
アルゴリズムとプログラミング (Algorithms and Programming)
description
Transcript of アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとプログラミング
(Algorithms and Programming)
第9回:クイックソート
•ソーティングアルゴリズムクイックソート
•ソーティングアルゴリズムクイックソート
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
ソーティングアルゴリズム
•選択ソート•マージソート•クイックソート•バブルソート•ヒープソート
クイックソートの考え方問題:
配列の要素を、小さい順に並べ替える配列の要素を、小さい順に並べ替える
方針:1.基準となる大きさの要素 (pivot) を選ぶ2. pivot” 未満”のグループと、”以上”のグループに グループ分けする
(”未満”の要素は左詰、”以上”の要素は右詰)3. 分割された各グループに対して同じことを繰り返す4.全てのグループの要素の数が1つになるまで繰り返す
1. pivot( 基準となる軸 ) を選択
pivot選択の方法: 方法1.先頭または最後の要素を選ぶ 方法2.中央にある要素を選ぶ 方法3.適当に選んだ3つの要素のうち、中央の値をとる ... etc
pivot よりも小さいグループ pivot と同じか、大きいグループ
2. pivot 未満のグループと、pivot 以上のグループにグループ分けする
3.分割されたそれぞれのグループに対して同様の分割を繰り返す
未満 以上 未満 以上
すべてのグループの要素が1つになったとき、ソート完了
簡単な方法で、なるべく分割が均等になるとよいが、pivotの選び方が複雑だと計算時間が増えてしまう。従って、限りなく機械的に選ぶ方法が採用される。(もちろん、裏目に出ることもある。。) 方法1.先頭または末尾の要素を選ぶ方法2.中央にある要素を選ぶ方法3.先頭、中央、末尾の3つの要素の中央の値をとる... etc
pivot 選択の方法
最悪な分割たとえば、大きい順に並んでいる配列に対して先頭要素(最大要素 ) を pivot として選択してしまった場合
pivot よりも小さいグループ
pivot と同じか大きいグループ
このままいくと、分割が完了するまでにN 回の分割が必要になってしまう!
最善の分割
分割回数はlog2N
ちょうど半分づつに分割していくと
分割回数が最少
クイックソートの計算量
最善の分割に近い分割なら計算量のオーダーとしてN ・ log2N
ただし、最悪ケースではN2
各分割では、値の比較と代入でオーダーとして N 回の演算操作が必要。これに分割段数を乗ずれば全体の計算量となる。
クイックソートの例 -1
4 7 3 5 8 2 6 1与えられた配列pivot
(与えられた配列と同じサイズの作業用配列を用意できる場合)
4 7 3 5 8 2 6 1一番左側の 4 を pivot とするpivot
4
4 は 4 以上なので作業用配列に右詰で格納する4作業用
配列
7 3 5 8 2 6 1先頭から2番目の 7 を pivot と比べるpivot
4
7 は 4 以上なので作業用配列に右詰で格納する7 4作業用
配列
3 5 8 2 6 1先頭から3番目の 3 を pivot と比べるpivot
4
3 は 4 より小さいので作業用配列に左詰で格納する3 7 4作業用
配列
5 8 2 6 1先頭から 4 番目の 5 を pivot と比べるpivot
4
5 は 4 以上なので作業用配列に右詰で格納する3 5 7 4作業用
配列
8 2 6 1先頭から 5 番目の 8 を pivot と比べるpivot
4
8 は 4 以上なので、作業用配列に右詰で格納する3 8 5 7 4作業用
配列
2 6 1先頭から 6 番目の 2 を pivot と比べるpivot
4
2 は 4 より小さいので作業用配列に左詰で格納する3 2 8 5 7 4作業用
配列
6 1先頭から 7 番目の 6 を pivot と比べるpivot
4
6 は 4 以上なので、作業用配列に右詰で格納する3 2 6 8 5 7 4作業用
配列
1先頭から 8 番目の 1 を pivot と比べるpivot
4
1 は 4 より小さいので作業用配列に左詰で格納する3 2 1 6 8 5 7 4作業用
配列
3 2 1 6 8 5 7 4
4 未満のグループと 4 以上のグループに分割されたpivot
作業用配列
それぞれのグループに対して同じことを行い、要素が1つ になるまで分割を繰り返す
左詰した要素と右詰した要素のグループで2分割される
3 2 1 6 8 5 7 4結果だけ記すpivot
3
3作業用配列
32 1 3
2 122
1 2
pivot
作業用配列
分割完了⇒ ( この部分は ) ソート完了
"3" は要素が1つになったので分割完了
2
1 2 3 6 8 5 7 4今度はこちらのグループpivot
6作業用配列 6
5 455
4 5
pivot
作業用配列
8 65 8 65 7 8 65 4 7 8 6
完了 残りは次ページ
今度はこちらのグループ
pivot
8作業用配列
78 7
7 8 6
6 8 7
8 78
7 8以上で全て要素が1つだけになったのでソート完了
pivot
7作業用配列
クイックソートの例 -2(要素1つ分の作業用領域を使用する場合)
4 7 3 5 8 2 6 1● 与えられた配列pivot 作業用領域
● 先頭の4を pivot とする
4 7 3 5 8 2 6 14pivot 作業用領域
● 並べ替えのため、先頭の4を作業領域へ
7 3 5 8 2 6 14pivot
4作業用領域
●4 は 4 以上なので、 1 を作業領域へ移して 4 を配列の最後に置く
7 3 5 8 2 6 44pivot
1作業用領域
●1 は 4 より小さいので配列の先頭におき、その次の 7 を取り出す
1 3 5 8 2 6 44pivot
7作業用領域
●7 は 4 以上なので、配列の最後から2番目の 6 を取り出し、 7 を置く
1 3 5 8 2 7 44pivot
6作業用領域
●6 は 4 以上なので、配列の最後から 3 番目の 2 を取り出し、 6 を置く
1 3 5 8 6 7 44pivot
2作業用領域
●2 は 4 より小さいので、配列の先頭から 2 番目に置き、次の 3 を取る
1 2 5 8 6 7 44pivot
3作業用領域
●3 は 4 より小さいので、配列の先頭から 3 番目に置き、次の 5 を取る
1 2 3 8 6 7 44pivot
5作業用領域
●5 は 4 以上なので、配列の最後から 4 番目の 8 を取り出し、 5 を置く
1 2 3 5 6 7 44pivot
8作業用領域
●8 は 4 以上なので、配列の最後から 5 番目に 8 を置く
1 2 3 8 5 6 7 44pivot 作業用領域
以上より、前半が4未満、後半が 4 以上のグループに分割された。同じことをそれぞれのグループに対して繰り返し適用する。すべてのグループが要素1つになるまで分割を繰り返す。
まとめ
•ソーティング ( 並べ替え ) アルゴリズム
クイックソート•pivot を決めて、それ以上の要素と未満の要素にグループを分割していくアルゴリズム
•ソーティング ( 並べ替え ) アルゴリズム
クイックソート•pivot を決めて、それ以上の要素と未満の要素にグループを分割していくアルゴリズム