データ構造とアルゴリズム論

Similar documents
データ構造とアルゴリズム論

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

データ構造とアルゴリズム論

データ構造とアルゴリズム論

データ構造とアルゴリズム論

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

データ構造とアルゴリズム論

データ構造

データ構造とアルゴリズム論

情報処理Ⅰ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

第1章 ビジュアルプログラミング入門

2

Prog2_10th

PowerPoint プレゼンテーション

2

Taro-再帰関数Ⅲ(公開版).jtd

問題1 以下に示すプログラムは、次の処理をするプログラムである

簡単な検索と整列(ソート)

Microsoft Word - VB.doc

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

Microsoft Word - 教科書大1b第12週06.doc

Prog1_6th

プログラミング入門1

PG13-6S

模擬試験問題(第1章~第3章)

データ構造とアルゴリズム論

第1章 ビジュアルプログラミング入門

Excel2013 データベース1(テーブル機能と並べ替え)

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Microsoft PowerPoint - å®�æ−•è©¦é¨fi3ㆮ対ç�Œ.pptx

Prog1_15th

オブジェクト指向プログラミング・同演習 5月21日演習課題

第1章 ビジュアルプログラミング入門

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Microsoft Word - no12.doc

Microsoft PowerPoint - ca ppt [互換モード]

Prog1_2nd

初めてのプログラミング

Microsoft Word - 09isA11_mod.doc

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

プログラミング基礎

2.Picasa3 の実行 デスクトップの をダブルククリック 一番最初の起動の時だけ下記画 面が立ち上がります マイドキュメント マイピクチャ デスクトップのみスキャン にチェックを入れ続行 これはパソコン内部の全画像を検索して Picasa で使用する基本データを作成するものですが 完全スキャン

プログラミングA

Microsoft Word - Word1.doc

マークアップ言語

2006年10月5日(木)実施

Microsoft PowerPoint - visualprogram.ppt

スライド 1

PowerPoint Presentation

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

gengo1-8

20180308森の日県南支部 林

Prog1_10th

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

1

Microsoft Word - VBA基礎(6).docx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Prog2_15th

JavaプログラミングⅠ

Prog1_11th

メソッドのまとめ

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

C#の基本

初めてのプログラミング

C 言語講座 Vol 年 5 月 29 日 CISC

ポインタ変数

Microsoft PowerPoint - prog03.ppt

プログラミング基礎

Prog2_9th

Java講座

やってみようINFINITY-写真管理 編-

データ構造

次の病院 薬局欄は 氏名 欄に入力された値によって入力すべき値が変わります 太郎の行く病院と花子の行く病院が必ずしも同じではないからです このような違いを 設定 シートで定義しておきましょう 太郎の行く病院のリストを 太郎 花子の行く病院のリストを 花子 として 2 つのリストが定義されています こ

Microsoft Word - VBA基礎(3).docx

※ ポイント ※

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

テキストファイルの入出力1

Microsoft Word - no103.docx

PowerPoint Presentation

Ⅰ. 問題を 1 問ずつ入力していく方法 1. 挿入 メニューから e- ラーニング を選び テスト をクリックして下さい 2. 新規テストの作成ウィザード ( テストの設定 ) が開くので各項目を設定して下さい ここでは 名称を 確認問題 満点を 5 点 合格点を 3 点 制限時間なしで設定します

Microsoft PowerPoint - 第3回目.ppt [互換モード]

データの作成方法のイメージ ( キーワードで結合の場合 ) 地図太郎 キーワードの値は文字列です キーワードの値は重複しないようにします 同じ値にする Excel データ (CSV) 注意キーワードの値は文字列です キーワードの値は重複しないようにします 1 ツールバーの 編集レイヤの選択 から 編

ガイダンス

Microsoft Word - M067【テキスト】PowerPoint2010(前).docx

GEC-Java

. 起動 目次 P.. ログイン 画面 P.. メニュー 画面 P.. POS 開示 _ 指定店舗 アイテム別 期間合計 画面 ( レポート A) P. 5. POS 開示 _ 店舗別 指定アイテム 期間合計 画面 ( レポート B) ----

Microsoft Word - _ ‘C’³_V1.6InstManual.doc

演算増幅器

IPPO - 校内研修支援プログラム - 使用説明書 目次 項 目 ページ 1 プログラム利用の準備 この説明書の記述について プログラムの動作環境等 プログラムファイルのコピー プログラムファイルの起動 4 2 プログラムファイルの利用

Microsoft Word -

program7app.ppt

SimLabプラグインは各機能を15回分評価版として試用できます

PowerPoint プレゼンテーション

プログラミング基礎

Microsoft Word - no11.docx

第1章 ビジュアルプログラミング入門

PowerPoint プレゼンテーション

Microsoft Word - データベース.doc

スライド 1

Transcription:

第 5 章. 整列 ( ソート ) のアルゴリズム 学習のねらい 1 整列 ( ソート ) を行う基本的なアルゴリズム ( バブルソート 選択ソート 挿入ソート ) を学習し その処理の流れを理解する 2 3つのソートアルゴリズムの効率について考察する 3 ソートアルゴリズムを応用したプログラムを学習する 幾つかのデータを 値の大きい順や小さい順などのように 一定の基準に従って並べ替える操作を整列 ( ソート ) と言います ソートは応用範囲の広い処理であることから様々なアルゴリズムが考案されており アルゴリズムの宝庫とも呼ばれていいます 本章では その内 最も基本的あるいは代表的な3つのソートアルゴリズムを学習し それらを幾つかの例に応用してみます 本章は アルゴリズム学習のクライマックスとなる内容であり 特に将来 情報技術関係の職に進みたい学生にとっては 必須の内容です 5-1 バブルソートまず 最も基本的であり ( アルゴリズム関係の ) どのような教科書にも出てくるバブルソートから学習を始めることにしましょう バブルソートとは 隣り合う2つのデータ ( の大小関係 ) を比較し 並べたい順序になっていなければ入れ替える という操作を繰り返すことで整列を行う手法です 具体的なケースで考えてみましょう 今 配列 A[0]~A[4] に数値 ( 整数 ) が入力されているものとします これを昇順に並べ替える場合を考えましょう < ソート前 > < ソート後 > 要素番号 0 1 2 3 4 0 1 2 3 4 配列 A 10 9 12 2 5 2 5 9 10 12 ここに データを小さい方から順に並べる場合を昇順と呼び 逆に大きい順に並べる場合を降順と言います 例えば 1,2,3,4,5 は昇順であり 5,4,3,2,1 は降順になります 次ページに 上例 ( のデータをバブルソートで昇順に並べ替えた場合 ) の処理の流れをまとめておきます 1ステップずつじっくりと確認して行って下さい 79

< バブルソートの処理の流れ > 要素番号 0 1 2 3 4 配列 A の値 10 9 12 2 5 ソート開始時 10 9 12 2 5 A[0]>A[1] なので ( 昇順ではないので ) 交換する 9 10 12 2 5 A[1]<A[2] なので ( 昇順なので ) 交換しない 9 10 12 2 5 A[2]>A[3] なので交換する 9 10 2 12 5 A[3]>A[4] なので交換する 9 10 2 5 12 A[4] の値確定! 9 10 2 5 12 A[0]<A[1] なので交換しない 9 10 2 5 12 A[1]>A[2] なので交換する 9 2 10 5 12 A[2]>A[3] なので交換する 9 2 5 10 12 A[3] の値確定! 9 2 5 10 12 A[0]>A[1] なので交換する 2 9 5 10 12 A[1]>A[2] なので交換する 2 5 9 10 12 A[2] の値確定! 2 5 9 10 12 A[0]<A[1] なので交換しない 2 5 9 10 12 A[1],A[0] の値確定! ソート完了! 80

上の処理を 流れ図で表すと次のようになります ただし 以下では配列の大きさを n として 配列 A[0]~A[n-1] に適当な値が入力されているものとしています < バブルソート ( 昇順 )> 開始ループ-i i:n-1,-1,1 ループ-j j:0,1,i-1 ループ端記号の表記カウンタ変数 : 初期値, 増分, 終値この場合 iの値は (n-1,n-2,,1) と減少して行っている事に注意 終端が外側のカウンタ変数 iによって変わっている点 ( を理解できるか ) がポイント! A[j]>A[j+1] Yes Temp A[j] A[j] A[j+1] A[j+1] Temp No A[j] と A[j+1] が昇順になっているかどうかを 判定し なっていなければ 値を交換します ループ -j ループ -i 終了 81

基礎課題 5-1 HP の該当部分から ある科目の得点が記録されたファイル tokuten.txt をダウンロードし これまで同様 フォルダ IOFile にコピーして下さい バブルソートを適用する練習として このファイルから得点を読み込み 昇順にソートするプログラムを作成しましょう 作成するプログラムの動作内容は次の通りです プログラムを起動すると 次のような画面が現れます jbuttonread jlabelread jbuttondisplay <tokuten.txt> 55 63 39 87 48 70 35 77 59 44 jbuttonbubblesort jlabelsort jtextarea1 入力ファイル指定のダイアログを用いるので jfilechooser コンポーネントを追加しておいて下さい ( やり方を忘れたら p.41 参照 ) ここで [ 読み込み ] ボタンをクリックします そして現れたダイアログボックスで tokuten.txt を指定すると 入力データの読み込みが完了します 82

ここで [ 表示 ] ボタンをクリックすると 今読み込んだ得点が ( そのまま ) 表示され ます 次に [ バブルソート ] ボタンをクリックすると バブルソートによる昇順ソートが完了します ( データのソートを行うだけなので jtextarea1 に表示された内容はまだ変わりません ) 続いて [ 表示 ] ボタンをクリックする と 昇順にソートされた得点リストが 表示されます それでは 作成にとりかかりましょう 以下の要領でプログラムを作成して下さい 83

< プログラムの作成 > 1. まずファイルを読み込むので いつもの通り波線部のインポート文を加えます import java.awt.event.actionevent; import javax.swing.swingutilities; import java.io.*; 2.[ 読み込み ] ボタンクリック時のイベントハンドラは次のようになります これは こ れまでと同じ要領です <[ 読み込み ] ボタン > int[] Tokuten= new int[100]; // 得点を保管する配列 int Num; // データの個数 private void jbuttonreadactionperformed(actionevent evt) { String Data; try { jfilechooser1.showopendialog(this); File FName=jFileChooser1.getSelectedFile(); BufferedReader fin=new BufferedReader(new FileReader(FName)); int i=0; while ((Data=fin.readLine())!=null) { Tokuten[i]=Integer.parseInt(Data); i++; Num=i; jlabelread.settext(" 読み込み終了しました "); fin.close(); catch (Exception em) { jlabelread.settext(" エラー発生 :"+em); 3.[ 表示 ] ボタンクリック時のイベントハンドラは次のようになります これは 基礎課 題 3-7 (p.58) と同じ要領です <[ 表示 ] ボタン > private void jbuttondisplayactionperformed(actionevent evt) { String Data=""; for (int i=0;i<num;i++) { 半角の です 使用フォントによ Data=Data+Tokuten[i]+" n"; っては \ と表示されます jtextarea1.settext(data); 84

4.[ バブルソート ] ボタンクリック時のイベントハンドラは次のようになります 空欄を 埋めてプログラムを完成させて下さい p.81 の流れ図を参照しながら考えれば分かるは ずです <[ バブルソート ] ボタン > private void jbuttonbubblesortactionperformed(actionevent evt) { int Temp; for (int i=num-1; i>=1 ;i--) { for (int j=0; j<=i-1 ;j++) { if(tokuten[j]>tokuten[j+1]) { Temp=Tokuten[j]; Tokuten[j]=Tokuten[j+1]; Tokuten[j+1]=Temp; jlabelsort.settext(" ソート完了しました "); 作成したら実行し 動作を確認してください 85

< バブルソート シミュレーションプログラム > バブルソートの処理を ( 視覚的に ) 確認できるデモプログラムを受講生用に作成しました HP の該当部に BubbleSort.exe の名前で掲載しています このプログラムをダウンロードして 処理の流れを今一度確認してください 使い方は 次の通りです プログラムを起動すると以下のような画面が現れるので ソート内容が昇順か 降順かを選択し 5つのデータ欄に適当な数値を代入します 数値入力後 [ 入力完了 ] ボタンをクリックすると準備完了です あとは [ 処理 ] ボタンをクリックする毎に 処理内容が表示され 変数の交換等の処理が行われます また 2 つの変数の大小比較や交換 ( 入れ替え ) を行う毎に その回数がカウントされます なお ソート完了後 [ リセット ] ボタンをクリックすると また最初からやり直すことができます 各自 何セットか実行し 処理の流れをじっくりと確認してください 基礎課題 5-2 バブルソートの場合 ( 隣り合う ) データの比較を行う回数は データ数によって決まっています データ数が 5 個の場合は 比較回数は幾つになるでしょうか? また 最大交換回数は幾つでしょうか? 各自 アルゴリズムに従って1ステップずつ処理の流れをトレースして確認して下さい 上の BubbleSort.exe を用いて確かめても結構です ( データ数 5 個の場合の ) 比較回数 ( データ数 5 個の場合の ) 最大交換回数 例えば降順に並んだ {5,4,3,2,1 を昇順にソートするとき データの交換回数は最大になります 86

5-2 選択ソート 前節と同じく 配列 A[0]~A[4] に入力された数値 ( 整数 ) を昇順に並べ替える場合を考 えましょう 選択ソートとは 1 5つの中から最小値を探し出し 先頭 (1 番目の ) データと交換する 1 番目のデータ確定 2 次に 残った 4 つの中から最小値を探し出し それを 2 番目のデータと交換する 2 番目のデータ確定 という操作を繰り返すものです つまり データの中から最小値あるいは最大値を選択し それを順次データ ( の未整列部分 ) の先頭に移動させる という処理を繰り返すことで 整列を実現しているわけです これが 選択ソートのアルゴリズムです 前節同様 次ページに具体的な処理の流れをまとめておきます 一つ一つの処理の流れを確認して行ってください 87

< 選択ソートの処理の流れ > 要素番号 0 1 2 3 4 配列 A の値 10 7 9 1 5 ソート開始時 10 7 9 1 5 A[0]~A[4] 中の最小値を見つける A[3] 10 7 9 1 5 A[0] と A[3] を交換する 1 7 9 10 5 A[0] の値確定! 1 7 9 10 5 A[1]~A[4] 中の最小値を見つける A[4] 1 7 9 10 5 A[1] と A[4] を交換する 1 5 9 10 7 A[1] の値確定! 1 5 9 10 7 A[2]~A[4] 中の最小値を見つける A[4] 1 5 9 10 7 A[2] と A[4] を交換する 1 5 7 10 9 A[2] の値確定! 1 5 7 10 9 A[3]~A[4] 中の最小値を見つける A[4] 1 5 7 10 9 A[3] と A[4] を交換する 1 5 7 9 10 A[3] の値確定! 1 5 7 9 10 同時に A[4] の値も確定! ソート完了! 88

上の処理を流れ図の形に整理してみましょう 今 大きさ n の配列 A[0]~A[n-1] に 整 数が入力されているものとします この配列要素を昇順に並べ替える場合の流れ図は次の ようになります < 選択ソート ( 昇順 )> 開始 ループ -i i:0,1,n-2 ループ -i によって i 番目の要素の値が確定します カウンタ変数 : 初期値, 増分, 終値 Pos i 最小値探索ループ -j j:i+1,1,n-1 最初に i( 先頭の要素 ) を最小値データの要素番号候補として変数 Pos(Position( 最小値の位置 ) という意味で Pos としています ) に代入する 最小値ではなく 要素番号を保管している点に注意 A[j]<A[Pos] Yes Pos j No 最小値探索ループによって 最小値の入った要素番号が 変数 Pos に格納されます 最小値探索ループ -j Temp A[i] A[i] A[Pos] A[Pos] Temp 配列要素 A[i] と A[Pos] の値を入れ替えます ループ -i 終了 89

基礎課題 5-3 アルゴリズムは 書く ことによって頭に刻みこまれます そこで流れ図を書く練習をしましょう 前頁の流れ図を参考にして 配列要素 A[0]~A[n-1] を選択ソート法で降順に並べ替える流れ図を 以下に記述してください 開始 終了 90

基礎課題 5-4 基礎課題 5-1 と同様に tokuten.txt から得点を読み込み 昇順にソートするプログラムを作成しましょう ただし 今度は 選択ソートを用います 基礎課題 5-1 のプログラムに次のように [ 選択ソート ] ボタンを追加して下さい 下の空欄を埋めて [ 選択ソート ] ボタンのイ ベントハンドラを完成させてください jbuttonsentakusort private void jbuttonsentakusortactionperformed(actionevent evt) { int Temp,Pos; for (int i=0;i<=num-2;i++) { Pos=i; for (int j=i+1; j<=num-1;j++) { if(tokuten[j]< ) { Pos=j; Temp=Tokuten[i]; Tokuten[i]=Tokuten[Pos]; = Temp; jlabelsort.settext(" ソート完了しました "); 作成したら実行し 動作を確認して下さい 基礎課題 5-5 前節と同じく 選択ソートの処理の流れを観察できるプログラムを HP の該当部に SentakuSort.exe の名前で掲載しています このプログラムをダウンロードして 適当なデータを入力することにより 処理の流れを視覚的に確認してください 選択ソートにおいても ソートに必要な比較回数は 入力データ ( の内容 ) に関わらず一定です 入力データ数が5つの場合 比較回数は幾つかを SentakuSort.exe を用いて確認してください 比較回数 91

5-3 挿入ソート本章で学習する最後のソート法として挿入ソートを採り上げましょう これは 部分的に整列されたデータの場合に威力を発揮するソート法です ここまで来ると皆もソートアルゴリズムに慣れてきた頃だと思いますので 前置きなしで 以下に処理の流れをまとめておきます 流れを確認して下さい < 挿入ソートの処理の流れ> 要素番号 0 1 2 3 4 配列 A の値 10 6 2 9 7 開始時 :A[0] までがソート済みと考える 10 6 2 9 7 A[1] を整列済み部分に追加する 6 10 2 9 7 A[1] を A[0]~A[1] 中の正しい位置に送る A[0]>A[1] なので入れ換える 6 10 2 9 7 A[0]~A[1] が整列済み 6 10 2 9 7 2 6 10 9 7 2 6 10 9 7 A[2] を整列済み部分に追加する A[2] を A[0]~A[2] 中の正しい位置に送る A[2] の値を A[1] A[0] の値と順に比較し 昇順でなければ入れ換える という操作を繰り返す A[0]~A[2] が整列済み 2 6 10 9 7 2 6 9 10 7 2 6 9 10 7 A[3] を整列済み部分に追加する A[3] を A[0]~A[3] 中の正しい位置に送る A[3] の値を A[2] A[1] の値と順に比較して行き A[1]<9 なのでそこで挿入位置確定 A[0]~A[3] が整列済み 2 6 9 10 7 A[4] を整列済み部分に追加する 2 6 7 9 10 A[4] を A[0]~A[4] 中の正しい位置に送る 2 6 7 9 10 A[0]~A[4] が整列済み ソート完了! 92

これまで同様 上の処理を流れ図で表すと次のようになります ただし以下では配列の大 きさを n として 配列 A[0]~A[n-1] に適当な値が入力されているものとしています < 挿入ソート ( 昇順 )> 開始 ループ -i i:0,1,n-2 A[0]~A[i] までが整列済みであるとしてスタート します j i+1 挿入ループ ( j 0 あるいは A[j-1] A[j] ) が成り立つまで ( 繰り返す ) Temp A[j-1] A[j-1] A[j] A[j] Temp j は挿入位置を意味します 挿入ループによって A[i+1] を A[0]~A[i+1] 中の正しい位置に送ります 終了条件に注意して下さい A[j-1] A[j] が成立する場合は その時点で A[j] の値が確定します なぜなら A[j-1] より前方はすでに昇順に整列済みなので 全て A[j] より小さいか等しいからです そのため これ以降は大小関係を比較する必要がないので ループを終了します j j-1 挿入ループループ-i 終了 ループ端記号の約束では ある条件が成り立つまで繰り返す という表記になっています 一方 プログラミング言語で while 文を用いる場合は ある条件が成り立っている間繰り返す という書き方になります したがって 上の条件は while( j 1 かつ A[j-1]>A[j] ) という条件の書き方になります 次ページの 基礎課題 5-6 を考える際注意してください 93

基礎課題 5-6 基礎課題 5-1 および 基礎課題 5-4 と同様に tokuten.txt から得点を読み込み 昇順にソートするプログラムを作成しましょう もちろん 今度は挿入ソートを用います 基礎課題 5-4 のプログラムに 次のように[ 挿入ソート ] ボタンを追加して下さい jbuttonsounyusort 下の空欄を埋めて [ 挿入ソート ] ボタンのイベントハンドラを完成させてください private void jbuttonsounyusortactionperformed(actionevent evt) { int Temp; for (int i=0;i<=num-2;i++) { int j=i+1; while ( j>=1 && Tokuten[j-1]>Tokuten[j] ) { Temp=Tokuten[j-1]; Tokuten[j-1]=Tokuten[j]; Tokuten[j]=Temp; j--; jlabelsort.settext(" ソート完了しました "); 作成後 プログラムを実行し 動作を確認してください 94

基礎課題 5-7 前節までと同じく 挿入ソートの処理の流れを観察できるプログラムを HP の該当部に SounyuSort.exe の名前で掲載しています このプログラムをダウンロードしてください そしてこれを用いて処理の流れを確認して下さい 挿入ソートとバブルソートに要する比較回数および交換回数には 次のような大小関係があります 実際にシミュレーションプログラムで確認して 空欄に入る記号を解答群から選んでください ( よく分からない人は 先に 5-4 節を読んで下さい ) < 解答群 > 比較回数 ( 挿入ソート ) 比較回数 ( バブルソート ) < > 交換回数 ( 挿入ソート ) 交換回数 ( バブルソート ) = 5-4 アルゴリズムの効率本章で学んだ3つのソートアルゴリズムは いずれを使っても問題なくソートを行うことができます しかし その効率には違いがあります アルゴリズムの効率については 本講義ではその詳細を扱いませんが ソート処理に関して言えば それに要する比較回数および交換回数が少ないほど効率が良い と理解しておいてください 本章で用意した ソートシミュレーションプログラムを用いて 色々な入力データについて動作を確かめてみると分かるのですが 以下の点が知られています 1. バブルソートと 選択ソートの比較回数は 同じです データ数が5つの場合は 10 となっていたと思います 種明かしをすると これは 5つの中から任意の2つの組み合わせを選ぶときの数です データ数がn 個であれば n(n-1)/2 となります つまり この2つのソートでは 全てのペアについて大小関係を比較している訳です 一方 挿入ソートの場合は すでに整列済みの部分については比較する必要がないので n(n-1)/2 以下になります 2. 一方 バブルソートと挿入ソートの交換回数は等しくなります なぜなら 順番通りに並んでいないペア数だけ交換するという事情は同じだからです これに対して選択ソートの交換回数は (n-1) 回と決まります ですから 最初に全て整列しているなどの特殊な場合を除いては 選択ソートの交換回数が最も少なくなる事が多いです 以上を整理すると次のようになります 比較回数 : ( バブルソート )=( 選択ソート )( =n(n-1)/2 ) ( 挿入ソート ) 交換回数 : ( バブルソート )=( 挿入ソート ), ( 選択ソート )= (n-1) これを見ると バブルソートは最も効率が悪い ということになります では 一般に挿入ソートと選択ソートではどちらの効率が良いのでしょうか? それは ソート対象とな 95

るデータに依存することになりますが 一般には 部分的に整列したデータが含まれることが多いので 挿入ソートが最も効率が良くなることが多いようです ここで どれを用いても正しくソートできるのなら どうして効率などにこだわるの? と疑問に思う人がいるかもしれません もっともな疑問ですが ソートプログラムが使われている現場では 数万個程度のデータを扱うことが少なくありません 例えば センター入試の全受験生の成績をソートする場合などを考えてみたらどうでしょう ( 昨年度の場合志願者は約 58 万人です!) このような場合 ソートアルゴリズムの効率が決定的にモノを言うのです 以上はやや専門的な内容なので 参考までに知っておいてくれれば結構です しかし 将来情報処理関係の技術者を目指す人にとっては 常識 として要求される知識です 5-5 応用問題 応用課題 5-A 応用課題 4-B を発展させて 今度は score3.txt のデータを読み込んで 下の様に 3 科目の合計点順に ( 降順に ) ソートして表示させるプログラムを作成してください ソート法としては挿入ソートを用いてください 入力ファイルを指定しデータの読み込 み完了後 [ 表示 ] ボタンをクリックす ると 受験生の成績が表示される [ 挿入ソート ] ボタンのクリック後 再度 [ 表示 ] ボタンをクリックすると 合計点 の高い順にソートされて表示される 96