8 1 qsort c n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」 PowerPoint Presentation
Download Presentation
アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」

Loading in 2 Seconds...

play fullscreen
1 / 114

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」 - PowerPoint PPT Presentation


  • 71 Views
  • Uploaded on

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90. 85. 70. 86. 92. 63. 85. クイックソート. 解の方針:基準よりも小さいエリアと大きいエリアに分割する。  それぞれのエリアについて、同じ 処理を行う(再帰呼び出し)。. 8 件のデータ. 65. 90.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

アルゴリズムとデータ構造 補足資料 8-1 「 クイックソート qsort.c 」


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
8 1 qsort c

アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」アルゴリズムとデータ構造補足資料8-1「クイックソートqsort.c」

横浜国立大学

理工学部

数物・電子情報系学科

富井尚志

slide2

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

slide3

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

左端

left

(定数)

右端

right

(定数)

真中

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。

・真中のキーよりも小さい要素は「左側」に移動。

・真中のキーよりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide4

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

「左側」の入替候補を探す

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)を基準にする。

・真中のキーよりも小さい要素は「左側」に移動。

・真中のキーよりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide5

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

左端

left

(定数)

右端

right

(定数)

比較:

基準より

小さい

OK!

左候補

i

(変数)

「左側」の入替候補を探す

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide6

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

比較:

基準より

大きい

NG!

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

「左側」の入替候補発見!

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide7

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補を探す

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide8

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

比較:

基準より

大きい

OK!

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補を探す

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide9

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

比較:

基準より

小さい

NG!

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補発見!

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide10

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

「左側」の入替候補

70

「右側」の入替候補

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide11

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

90

85

70

86

92

63

85

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

「左側」の入替候補

70

「右側」の入替候補

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide12

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

85

70

86

92

85

90

63

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

「左側」の入替候補

70

「右側」の入替候補

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide13

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

入替

右端

right

(定数)

左端

left

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide14

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

左候補

i

(変数)

右候補

j

(変数)

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide15

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

「左側」の入替候補を探す

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide16

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

「左側」の入替候補発見!

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide17

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補を探す

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide18

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補を探す

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide19

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補を探す

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide20

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

70

「右側」の入替候補発見!

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide21

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

85

70

86

92

90

85

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

「左側」の入替候補

70

「右側」の入替候補

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide22

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

86

92

90

85

85

70

入替

右端

right

(定数)

左端

left

(定数)

左候補

i

(変数)

右候補

j

(変数)

「左側」の入替候補

70

「右側」の入替候補

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide23

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

70

85

86

92

90

85

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide24

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

70

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

右候補

j

(変数)

左候補

i

(変数)

左候補

i

(変数)

70

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide25

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

70

85

86

92

90

85

右端

right

(定数)

左端

left

(定数)

右候補

j

(変数)

左候補

i

(変数)

iとjが逆転:

ここが分かれ目!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide26

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

70

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide27

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

65

63

70

85

86

92

90

85

右端

right

(定数)

左端

left

(定数)

右端

j

right

左端

i

left

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide28

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

左端

left

(定数)

右端

j

right

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide29

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

左端

left

(定数)

右端

right

(定数)

真中

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide30

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide31

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide32

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide33

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

65

63

70

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide34

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide35

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide36

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

63

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide37

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

iとjが逆転:

ここが分かれ目!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide38

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間は

ソート完了

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide39

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

真中

65

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide40

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

比較:

NG!

左候補

i

(変数)

65

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide41

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

65

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide42

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

65

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide43

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

右候補

j

(変数)

左候補

i

(変数)

同じ場所を

指しているので

入替不要

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide44

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

右候補

j

(変数)

左候補

i

(変数)

左候補

i

(変数)

右候補

j

(変数)

同じ場所を

指しているので

入替不要

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide45

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

左候補

i

(変数)

右候補

j

(変数)

leftとjが逆転:

ソート完了!

iとrightが一致:

ソート完了!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide46

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

65

70

右端

right

(定数)

左端

left

(定数)

左候補

i

(変数)

右候補

j

(変数)

leftとjが逆転:

ソート完了!

iとrightが一致:

ソート完了!

呼び出し元に戻る

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide47

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

3件のデータ

63

65

70

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

ソート完了!

呼び出し元に戻る

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide48

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

63

65

70

85

86

92

90

85

右端

right

(定数)

左端

left

(定数)

右端

j

right

左端

i

left

この区間をクイックソート

(再帰呼出)

ソート完了!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide49

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

63

65

70

85

86

92

90

85

右端

right

(定数)

左端

left

(定数)

右端

j

right

左端

i

left

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide50

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide51

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

真中

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide52

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide53

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide54

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide55

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide56

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

92

90

85

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide57

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide58

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

右端

right

(定数)

左端

left

(定数)

左候補

i

(変数)

左候補

i

(変数)

右候補

j

(変数)

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide59

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide60

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide61

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide62

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

比較:

NG!

右候補

j

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide63

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

92

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide64

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

92

逆転しているので

入替不要

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide65

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

92

iとjが逆転:

ここが分かれ目!

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide66

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

86

85

90

92

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

左端

i

left

右端

j

right

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide67

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide68

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

真中

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide69

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide70

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide71

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide72

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide73

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

86

85

90

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide74

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

入替

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide75

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide76

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

iとjが逆転:

ここが分かれ目!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide77

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide78

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide79

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

真中

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide80

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide81

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

右候補

j

(変数)

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide82

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

入替

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide83

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

入替

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide84

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

右候補

j

(変数)

左候補

i

(変数)

左候補

i

(変数)

右候補

j

(変数)

85

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide85

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

iとjが逆転:

ここが分かれ目!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide86

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide87

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

85

85

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

呼び出し元に戻る

この区間は

ソート完了

この区間は

ソート完了

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide88

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

ソート完了!

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide89

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide90

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide91

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

真中

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide92

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

比較:

NG!

左候補

i

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide93

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide94

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide95

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

比較:

OK!

左候補

i

(変数)

右候補

j

(変数)

左候補

i

(変数)

右候補

j

(変数)

86

基準

x

(定数)

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide96

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

2件のデータ

86

90

左端

left

(定数)

右端

right

(定数)

左候補

i

(変数)

右候補

j

(変数)

leftとjが逆転:

ソート完了!

iとrightが一致:

ソート完了!

呼び出し元に戻る

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide97

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

4件のデータ

85

85

86

90

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

ソート完了!

呼び出し元に戻る

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide98

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

85

86

90

92

左端

left

(定数)

右端

right

(定数)

この区間をクイックソート

(再帰呼出)

ソート完了!

左端

i

left

右端

j

right

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide99

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

5件のデータ

85

85

86

90

92

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

iとrightが一致:

ソート完了!

呼び出し元に戻る

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide100

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

8件のデータ

63

65

70

85

85

86

90

92

左端

left

(定数)

右端

right

(定数)

左端

i

left

右端

j

right

この区間をクイックソート

(再帰呼出)

ソート完了!

呼び出し元に戻る→mainへ

左端~右端の「区間」について、真中にある要素のキー(値)をとりあえず基準にする。

・基準よりも小さい要素は「左側」に移動。

・基準よりも大きい要素は「右側」に移動。

 →左右が逆になっている組み合わせを「入れ替える」!

slide101

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

slide102

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

slide103

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

slide104

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

slide105

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

slide106

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

slide107

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

slide108

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

slide109

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

slide110

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

slide111

クイックソート

解の方針:基準よりも小さいエリアと大きいエリアに分割する。

 それぞれのエリアについて、同じ処理を行う(再帰呼び出し)。

n件のデータ

       未整列

基準

n回の比較,1~n/2回の入替

基準より小さい要素

基準より大きい要素

再帰

呼出

再帰

呼出

log2 n

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

再帰

呼出

O(n x log n)の比較・入替

slide112

データ件数

1,000,000

1,000,000,000

1,000

O( 1 )

1

1

1

O(log n)

10

20

30

O(n)

1,000

1,000,000

1,000,000,000

O(n x log n)

10,000

20,000,000

30,000,000,000

O(n2)

1,000,000

1,000,000,000,000

1,000,000,000,000,000,000

O(2n)

10300

10300,000

10300,000,000

slide113

1回あたり1ms ( = 10-3 sec)で計算できる場合

データ件数

1,000,000

1,000,000,000

1,000

O( 1 )

1 msec

1msec

1msec

O(log n)

10 msec

20 msec

30 msec

O(n)

1 sec

1,000 sec

1,000,000 sec

(11日)

O(n x log n)

10 sec

2x104 sec

3x107sec

(5.5h)

(1年)

O(n2)

1,000 sec

109 sec

1015 sec

(30年)

(3千万年)

O(2n)

10297sec

10299,997 sec

10299,999,997 sec

10290年

宇宙の歴史10280回

slide114

1回あたり0.1ns ( = 10-10 sec)で計算できる場合: 1,000万倍速い計算機

データ件数

1,000,000

1,000,000,000

1,000

O( 1 )

10-10 sec

10-10 sec

10-10 sec

O(log n)

10-9 sec

2x10-9 sec

3x10-9 sec

O(n)

10-7 sec

10-4 sec

10-1 sec

O(n x log n)

10-6 sec

2x10-3 sec

3 sec

O(n2)

10-4 sec

100 sec

108 sec

(3年)

O(2n)

10290 sec

10299,990 sec

10299,999,990 sec

10282年

宇宙の歴史10272回