• 検索結果がありません。

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
114
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズムとデータ構造 補足資料 8-1

「クイックソート qsort.c 」

横浜国立大学 理工学部 数物・電子情報系学科 富井尚志

(2)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

(3)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

真中

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

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

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

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

70

基準 x

(定数)

(4)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

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

(5)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

基準より 比較:

小さい OK!

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

(6)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

基準より 比較:

大きい NG!

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

(7)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

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

(8)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

基準より 比較:

大きい OK!

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

(9)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

基準より 比較:

小さい NG!

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

(10)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

「左側」の入替候補 「右側」の入替候補

(11)

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

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

8 件のデータ クイックソート

65 90 85 70 86 92 63 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

「左側」の入替候補 「右側」の入替候補

入替

(12)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

「左側」の入替候補 「右側」の入替候補

90 入替 63

(13)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

入替

90

63

(14)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

90 63

左候補 i

(変数)

右候補 j

(変数)

(15)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

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

(16)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

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

比較:

NG!

(17)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

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

右候補 j

(変数)

(18)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

比較:

OK!

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

右候補 j

(変数)

(19)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

比較:

OK!

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

右候補 j

(変数)

(20)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

比較:

NG!

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

右候補 j

(変数)

(21)

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

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

8 件のデータ クイックソート

65 85 70 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

「右側」の入替候補

右候補 j

(変数)

「左側」の入替候補

入替

(22)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

「右側」の入替候補

右候補 j

(変数)

「左側」の入替候補

入替

70

85

(23)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

右候補 j

(変数)

入替

70 85

(24)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

70

基準 x

(定数)

90 63

左候補 i

(変数)

右候補 j

(変数)

70 85

左候補 i

(変数)

右候補 j

(変数)

(25)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 63 70 85

左候補 i

(変数)

右候補 j

(変数)

i と j が逆転:

ここが分かれ目!

(26)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 63 70 85

左端 i

lef 右端

j

right

(27)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 63 70 85

左端 i

lef 右端

j

right

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

(再帰呼出)

(28)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 j

right

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

(再帰呼出)

(29)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

真中

63

基準 x

(定数)

(30)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

(31)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

比較:

OK!

右候補

j

(変数)

(32)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

右候補

j

(変数)

(33)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

入替

(34)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

入替

(35)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

左候補 i

(変数)

右候補 j

(変数)

(36)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

63

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

(37)

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right 左候補 (定数)

i

(変数)

右候補 j

(変数)

i と j が逆転:

ここが分かれ目!

(38)

左端 i

lef 右端

j

right

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

この区間は

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

(再帰呼出)

(39)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)

真中

65

基準 x

(定数)

(40)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)

65

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

(41)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)

65

基準 x

(定数)

左候補 i

(変数)

比較:

OK!

右候補

j

(変数)

(42)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)

65

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

右候補 j

(変数)

(43)

右候補 j

(変数)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)左候補 i

(変数)

同じ場所を 指しているの

入替不要 で

(44)

右候補 j

(変数)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数)左候補 i

(変数)

同じ場所を 指しているの

入替不要 で

左候補 i

(変数)

右候補 j

(変数)

(45)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数) 左候補 i

(変数)

右候補 j

(変数)

lef と j が逆転:

ソート完了! i と right が一致:

ソート完了!

(46)

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

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

2 件のデータ クイックソート

65

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

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

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

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

70

右端 right

(定数)

左端 lef

(定数) 左候補 i

(変数)

右候補 j

(変数)

lef と j が逆転:

ソート完了! i と right が一致:

ソート完了!

呼び出し元に戻る

(47)

左端 i

lef 右端

j

right

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

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

3 件のデータ クイックソート

65

左端 lef

(定数)

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

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

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

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

63 70

右端 right

(定数)

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

(再帰呼出)

ソート完了! ↓ 呼び出し元に戻る

(48)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 63 70 85

左端 i

lef 右端

j

right

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

(再帰呼出)

ソート完了! ↓

(49)

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

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

8 件のデータ クイックソート

65 86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 63 70 85

左端 i

lef 右端

j

right

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

(再帰呼出)

(50)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

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

(再帰呼出)

(51)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

真中

92

基準 x

(定数)

(52)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

比較:

OK!

(53)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

比較:

OK!

(54)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

(55)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

比較:

NG!

右候補

j

(変数)

(56)

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

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

5 件のデータ クイックソート

86 92 85

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

入替

(57)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

92 85

入替

(58)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

左候補 i

(変数)

右候補 j

(変数)

92 85

左候補 i

(変数)

右候補 j

(変数)

(59)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

左候補 i

(変数)

右候補 j

(変数)

(60)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

左候補 i

(変数)

比較 :

OK!

(61)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

左候補 i

(変数)

比較 :

NG!

(62)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

比較 : NG!

右候補 j

(変数)

(63)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

右候補 j

(変数)

左候補 i

(変数)

(64)

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

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

5 件のデータ クイックソート

86

左端 lef

(定数)

右端 right

(定数)

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

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

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

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

90 85

92

基準 x

(定数)

92 85

右候補 j

(変数)

左候補 i

(変数)

逆転している

入替不要 ので

参照

関連したドキュメント

情報理工学研究科 情報・通信工学専攻. 2012/7/12

関東総合通信局 東京電機大学 工学部電気電子工学科 電気通信システム 昭和62年3月以降

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

清水 悦郎 国立大学法人東京海洋大学 学術研究院海洋電子機械工学部門 教授 鶴指 眞志 長崎県立大学 地域創造学部実践経済学科 講師 クロサカタツヤ 株式会社企 代表取締役.

静岡大学 静岡キャンパス 静岡大学 浜松キャンパス 静岡県立大学 静岡県立大学短期大学部 東海大学 清水キャンパス

講師:首都大学東京 システムデザイン学部 知能機械システムコース 准教授 三好 洋美先生 芝浦工業大学 システム理工学部 生命科学科 助教 中村

静岡大学 静岡キャンパス 静岡大学 浜松キャンパス 静岡県立大学 静岡県立大学短期大学部 東海大学 清水キャンパス

物質工学課程 ⚕名 電気電子応用工学課程 ⚓名 情報工学課程 ⚕名 知能・機械工学課程