アルゴリズムとプログラミング (Algorithms and Programming)

24
アアアアアアアアアアアアアア (Algorithms and Programming) アア アアアアアアア 9: •アアアアアアアアアアアア アアアアアアア アアアアアhttp://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html

description

アルゴリズムとプログラミング (Algorithms and Programming). ソーティングアルゴリズム クイックソート. 第9回:クイックソート. 講義資料等:. http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html. ソーティングアルゴリズム. 選択ソート マージソート クイックソート バブルソート ヒープソート. クイックソートの考え方. 問題:. 配列の要素を、小さい順に並べ替える. 方針:. 1.基準となる大きさの要素 ( pivot ) を選ぶ - PowerPoint PPT Presentation

Transcript of アルゴリズムとプログラミング (Algorithms and Programming)

Page 1: アルゴリズムとプログラミング (Algorithms and Programming)

アルゴリズムとプログラミング

(Algorithms and Programming)

第9回:クイックソート

•ソーティングアルゴリズムクイックソート

•ソーティングアルゴリズムクイックソート

講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html

Page 2: アルゴリズムとプログラミング (Algorithms and Programming)

ソーティングアルゴリズム

•選択ソート•マージソート•クイックソート•バブルソート•ヒープソート

Page 3: アルゴリズムとプログラミング (Algorithms and Programming)

クイックソートの考え方問題:

配列の要素を、小さい順に並べ替える配列の要素を、小さい順に並べ替える

方針:1.基準となる大きさの要素 (pivot) を選ぶ2. pivot” 未満”のグループと、”以上”のグループに  グループ分けする

(”未満”の要素は左詰、”以上”の要素は右詰)3. 分割された各グループに対して同じことを繰り返す4.全てのグループの要素の数が1つになるまで繰り返す

Page 4: アルゴリズムとプログラミング (Algorithms and Programming)

1. pivot( 基準となる軸 ) を選択

pivot選択の方法: 方法1.先頭または最後の要素を選ぶ 方法2.中央にある要素を選ぶ 方法3.適当に選んだ3つの要素のうち、中央の値をとる ... etc

Page 5: アルゴリズムとプログラミング (Algorithms and Programming)

pivot よりも小さいグループ pivot と同じか、大きいグループ

2. pivot 未満のグループと、pivot 以上のグループにグループ分けする

Page 6: アルゴリズムとプログラミング (Algorithms and Programming)

3.分割されたそれぞれのグループに対して同様の分割を繰り返す

未満 以上 未満 以上

Page 7: アルゴリズムとプログラミング (Algorithms and Programming)

すべてのグループの要素が1つになったとき、ソート完了

Page 8: アルゴリズムとプログラミング (Algorithms and Programming)

簡単な方法で、なるべく分割が均等になるとよいが、pivotの選び方が複雑だと計算時間が増えてしまう。従って、限りなく機械的に選ぶ方法が採用される。(もちろん、裏目に出ることもある。。) 方法1.先頭または末尾の要素を選ぶ方法2.中央にある要素を選ぶ方法3.先頭、中央、末尾の3つの要素の中央の値をとる... etc

pivot 選択の方法

Page 9: アルゴリズムとプログラミング (Algorithms and Programming)

最悪な分割たとえば、大きい順に並んでいる配列に対して先頭要素(最大要素 ) を pivot として選択してしまった場合

Page 10: アルゴリズムとプログラミング (Algorithms and Programming)

pivot よりも小さいグループ

pivot と同じか大きいグループ

このままいくと、分割が完了するまでにN 回の分割が必要になってしまう!

Page 11: アルゴリズムとプログラミング (Algorithms and Programming)

最善の分割

分割回数はlog2N

ちょうど半分づつに分割していくと

分割回数が最少

Page 12: アルゴリズムとプログラミング (Algorithms and Programming)

クイックソートの計算量

最善の分割に近い分割なら計算量のオーダーとしてN ・ log2N

ただし、最悪ケースではN2

各分割では、値の比較と代入でオーダーとして N 回の演算操作が必要。これに分割段数を乗ずれば全体の計算量となる。

Page 13: アルゴリズムとプログラミング (Algorithms and Programming)

クイックソートの例 -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作業用

配列

Page 14: アルゴリズムとプログラミング (Algorithms and Programming)

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作業用

配列

Page 15: アルゴリズムとプログラミング (Algorithms and Programming)

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作業用

配列

Page 16: アルゴリズムとプログラミング (Algorithms and Programming)

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作業用

配列

Page 17: アルゴリズムとプログラミング (Algorithms and Programming)

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分割される

Page 18: アルゴリズムとプログラミング (Algorithms and Programming)

3 2 1 6 8 5 7 4結果だけ記すpivot

3

3作業用配列

32 1 3

2 122

1 2

pivot

作業用配列

分割完了⇒ ( この部分は ) ソート完了

"3" は要素が1つになったので分割完了

2

Page 19: アルゴリズムとプログラミング (Algorithms and Programming)

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

完了 残りは次ページ

Page 20: アルゴリズムとプログラミング (Algorithms and Programming)

今度はこちらのグループ

pivot

8作業用配列

78 7

7 8 6

6 8 7

8 78

7 8以上で全て要素が1つだけになったのでソート完了

pivot

7作業用配列

Page 21: アルゴリズムとプログラミング (Algorithms and Programming)

クイックソートの例 -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作業用領域

Page 22: アルゴリズムとプログラミング (Algorithms and Programming)

●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作業用領域

Page 23: アルゴリズムとプログラミング (Algorithms and Programming)

●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つになるまで分割を繰り返す。

Page 24: アルゴリズムとプログラミング (Algorithms and Programming)

まとめ

•ソーティング ( 並べ替え ) アルゴリズム

クイックソート•pivot を決めて、それ以上の要素と未満の要素にグループを分割していくアルゴリズム

•ソーティング ( 並べ替え ) アルゴリズム

クイックソート•pivot を決めて、それ以上の要素と未満の要素にグループを分割していくアルゴリズム