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

ヒントスライドPPT プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPPT プログラミング演習2 #prog2bkc net"

Copied!
18
0
0

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

全文

(1)

第11週 ソート(3)

ヒープソート、マージソート

クイックソート

(2)

必須問題 11-1: ヒープソート

アルゴリズム

選択法(最小値選択を反復して整列)に

ヒープの概念を取り入れて効率よく整列を行う手法

ヒープソートの手順

ヒープ木を作成する

• 10-3 の insert を利用

 ヒープ木のルート取り出す

• 10-4deletemin を反復実行して、ヒープの再構成を反復して行い、 各時点での最小値を取り出す

 取り出した最小値を保存

昇順(小さい順)なら配列の前から保存、

– または、キューに保存して、後から取り出す

• 降順(大きい順)スタックに格納し、 – 配列の後ろから保存、

今回はこっち

(3)

参考プログラム: 11-1( ヒープ:1基準 )

#define HEAP_SIZE int main(){

int numbers[HEAP_SIZE]; int heap[HEAP_SIZE+1]; int heap_size = 0;

/* 略:変数宣言、 numbers.dat のファイル読込み */ printArray(numbers, n);

printArray(numbers, n);

return 0;

} ソート処理の確認用

insert を利用しヒープ木の作成 10-3を参照

配列のサイズを定義

deletmin で値を取り出し numbers に保存 昇順:

 配列( numbers )の先頭から順に保存 降順:

 配列( numbers )の後ろから順に保存 10-4を参照

ヒープ木の作成

値の保存

ヒープの一次元配列:1基準なので+1

ソート前の配列の表示

(4)

参考プログラム: printArray

void printArray(int numbers[], int length){    int i=0;

   printf("Array = [ ");

   for (i = 0; i < length; i++) {      printf("%d ", numbers[i]);    }

   printf("]\n"); }

(5)

オプション課題 11-2 :マージソート

アルゴリズム

入力系列を 2 つに分割して、各々の系列を整列し、そ

の後、統合(マージ)することで整列を行う手法

(分割された系列の整列にもマージソートを使う。

よってこれは再帰的に整列を行っている。)

マージソートの手順

入力を分割

• 再帰で入力系列を 2 分割を繰り返す

 統合(マージ):昇順の場合

• 統合する2つの入力の先頭から比較を行い、統合後小さい

値を先頭から順に代入していく

(6)

マージソートの例:分割

15 19 29 9 16 11 6 3

15 19 29 9 16 11 6 3

15 19 29 9 16 11 6 3

15 19 29 9 16 11 6 3

2 分割

2 分割

2 分割

(7)

15 19 9 29 11 16 3 6

マージソートの例:統合

15

19 29

9 16

11 6

 統合(マージ):昇順の場合

• 2つの入力の先頭から比較を行い、統合

後小さい値を先頭から代入していく

統合後 統合前

比較し小さい方を

先に代入する 比較し小さい方を先に代入する 比較し小さい方を先に代入する 比較し小さい方を先に代入する

(8)

マージソートの例:統合

15 19 9 29 11 16 3 6

2 段階目(左半分):ステップ1:

左側の先頭(15)と右側の先頭(9)を比較し、 小さい 9 が統合後の先頭の値になる

15 19 9 29 11 16 3 6

2 段階目(左半分):ステップ2:

左側の先頭(15)と右側の2番目の値(29)を比較し、 小さい 15 が統合後の 2 番目の値になる

比較し小さい方を代入する

比較し小さい方を代入する

(9)

マージソートの例:統合

15 19 9 29

2 段階目(左半分):ステップ3:

左側の2番目(19)と右側の 2 番目(29)を比較し、 小さい19が統合後の3番目の値になる

大きい29が統合後の4番目の値になる

15 19 29

ポイント

比較し小さい方を先に代入する

(10)

マージソートの例:統合

2 段階目(右半分):ステップ1:

左側の先頭(11)と右側の先頭(3)を比較し、 小さい3が統合後の先頭の値になる

2 段階目(右半分):ステップ2:

左側の先頭(11)と右側の2番目の値(6)を比較し、 小さい6が統合後の 2 番目の値になる

15 19 29 11 16 3 6

15 19 29

比較し小さい方を代入する

15 19 29 11 16 3 6

比較し小さい方を代入する

(11)

マージソートの例:統合

ポイント

15 19 29 11 16 3 6

15 19 29 3 6 11 16

2 段階目(右半分):ステップ3:

左側の先頭(11)右側の 2 番目を(16)を比較し、 それぞれ統合後の3番目と 4 番目の値になる

(12)

マージソートの例:統合

15 19 29 3 6 11 16

比較し小さい方を代入する

15 19 29 11 16

比較し小さい方を代入する

15 19 29 11 16

比較し小さい方を代入する

1段階目:ステップ1:

1段階目:ステップ2:

1段階目:ステップ3:

(13)

マージソートの例:統合

3 6 9 11 15 16 19 29

9 15 19 29 3 6 11 16

残りのステップも同様に比較を行い小さい方を代入していく

全て統合し終わると昇順に値が並んでいる

(14)

オプション課題 11-3 :クイックソート

アルゴリズム

 入力系列を 2 つに分割(必ずしも等分割ではない)して、

各々の系列を整列し、その後、あわせる。

また整列された部分集合を統合する必要がない。

 クイックソートの手順(昇順の場合)

Step1: ピボット(基準値)を決める。

   ピボットの決め方は、様々(例えば、一番後ろの値)

Step2: ピボットより小さい値を左に、

ピボットより大きい値を右に集める。

   (左からピボットより大きい値し、

   右からピボットより小さい値を探し、入れ替える

   

左右に分けた入力について、

新たにピボットを決め ,

(15)

オプション課題 11-3 :クイックソート

16 3 29 19 9 6 11 15

ピボットより 大きい値を検索

ピボットより 小さい値を検索

16 3 29 19 9 6 11 15

11 3 29 19 9 6 16 15

11 3 6 19 9 29 16 15

交換

交換

交換

ピボット(基準値) 15

検索が交差したら 次のステップへ

(16)

オプション課題 11-3 :クイックソート

11 3 6 9 15 29 16 19

11 3 6 9 15

6 3 11 9 15

6 3 9 11 15 16 29 19

29 16 19

29 16 19

交換

交換

前ページの処理によって ピボット(15)より 小さい値が集まった

前ページの処理によって ピボット(15)より 大きい値が集まった 次のピボット

(17)

オプション課題 11-3 :クイックソート

6 3 9 11 15 29 16 19

15 29 16 19

15 16 29 19

3 6 9 11

3 6 9 11

交換

交換

ピボットは3

15 29 16 19

3 6 9 11

ピボットは 19

(18)

著者リスト

1. 安積 卓也(情報システム学科)

参照

関連したドキュメント

 文学部では今年度から中国語学習会が 週2回、韓国朝鮮語学習会が週1回、文学

国連ユースボランティア 5カ月間 5カ月間 1学期間 約1カ月間 約1カ月間 約1週間 約2週間 約1週間 約2週間 約1週間 約3週間 約6週間 約4週間

卒論の 使用言語 選考要件. 志望者への

国際地域理解入門B 国際学入門 日本経済基礎 Japanese Economy 基礎演習A 基礎演習B 国際移民論 研究演習Ⅰ 研究演習Ⅱ 卒業論文

授業は行っていません。このため、井口担当の 3 年生の研究演習は、2022 年度春学期に 2 コマ行います。また、井口担当の 4 年生の研究演習は、 2023 年秋学期に 2

使用言語 日本語 選考要件. 登録届を提出するまでに個別面談を受けてください。留学中で直接面談 できない場合は Skype か

卒論の 使用言語 選考要件

[r]