並べ替えのプログラム

Download Report

Transcript 並べ替えのプログラム

Javaプログラミング
・If文とfor文を思い出そう
・並べ替えのプログラム
・構造化プログラミング
・流れ図とアルゴリズムの考え方
・検索のプログラム
並べ替えのプログラム




前回のIf8a.javaを見てみましょう。
どのような処理をしているでしょうか?
ループが二重になっているのはなぜで
しょうか?
入力の部分もforを使って書いてみましょ
う
並べ替えのプログラム
data[0] data[1] data[2] data[3]
最初の状態
(例)
10
20
30
40
data[4]
50
小さい順に並んでいるものを大きい順に並べ変えることが
一番手間がかかるので,これを例に考えてみましょう。
j=0, i=0
20
10
30
40
50
j=0, i=1
20
30
10
40
50
並べ替えのプログラム
data[0] data[1] data[2] data[3]
data[4]
j=0, i=2
20
30
40
10
50
j=0, i=3
20
30
40
50
10
j=0におけるiに関するループ処理が終了して,ようやく
最も大きい数値が一つだけ左に移動しました。
この数値をdata[0]の位置まで移動させるには,あと三つ
左に移動しなければなりません。つまり,jに関してあと三
回,同様の処理を繰り返す必要があると言うことです。
よって,j=0~3,それぞれのjについてi=0~3の,計16回
のループ処理が必要になります。
徐々に数値が
移動していく様
子が,「泡が水
面に上がってく
る様子と似てい
る」ことから,
「バブルソート」
と呼ばれます。
言語の学習としてのプログラミング

単語を覚えよう
– println, int, double, if, for ・・・

文法を覚えよう
– System.out.println(‘Hello, world’); ではだめなの?

基本文型を覚えよう
– 英語には「基本5文型」があります。
– プログラミング言語に基本文型はあるのでしょうか?

用例を積極的に利用しよう
– 単語や文法を覚えても英作文は出来ない。。
– 誰かが書いた英文を利用しよう!
– プログラミングも同じです!
言語の学習としてのプログラミング

基本文型を覚えよう
– 英語には「基本5文型」があります。
S+V
 S+V+C
 S+V+O
 S+V+O+O
 S+V+O+C

– プログラミング言語に基本文型はあるのでしょ
うか?

あります!
言語の学習としてのプログラミング

基本文型を覚えよう
– 「制御構造」とも呼ばれます。文(処理)の並べ方
の決まりです。次の3つです。

順次構造
– 順番に処理を実行していく構造。

選択構造
– もしAならば処理Bを実行し,そうでない場合処理Cを実行す
る。

繰り返し構造
– Aが成り立っている間,処理Bを繰り返し実行する。
– 全てのプログラムは,この3つの構造で書かれ
ています=「構造化プログラミング」
「構造」の表し方 ~流れ図~
選択構造(if文)
条件
真
処理1
処理1
条件
if(
偽
処理2
条件
処理1
}
else{
処理2
処理2
}
){
他の流れ図の描き方
選択構造

フローチャート以外にも様々な描き方があります。
真 処理1
偽
真
条件
条件
条件
処理1
フローチャート
処理2
偽 処理2
PAD
真
偽
処理1
処理2
TSチャート
「構造」の表し方 ~流れ図~
繰り返し構造(for文)
iは繰り返し回数をカウントする変数
iの値を1に設定
i の値は回数以下 ?
No
for(i=1;i<=回数;i++ ){
Yes
実行したい処理
実行したい処理
i の値を1増やす
}
他の流れ図の描き方
繰り返し構造
初期値設定
条件
Yes
実行する処理
No
繰り返し
条件
条件
処理
繰り返し条件の変更
フローチャート
処理
PAD
TSチャート
while文を使ったプログラム

決まり文句を覚えておきましょう。
最初の条件要素の設定
while( 繰り返し条件 ){
実行したい処理;
繰り返しの条件要素の再設定
}
while1a.javaを見てみましょう
アルゴリズムの考え方

では,どうやって「与えられた問題をこれら3つ
の構造で表現する」のでしょうか?

次のように考えましょう
– 与えられた課題の解析

例:「大きい順に並んでいるとはどういう状態か?」
– その状態を繰り返しと分岐でどのように表現する
か?
– 矛盾が生じている時(例:大きい順になっていない
時)にはどのようにするか?
ソートアルゴリズム


次の配列の内容が昇順になるようにソート
するプログラムを作成しなさい。
a[0], a[1], a[2], a[3], ………, a[n-1]
課題の解析
昇順にソートされているとはどういうことか
a[0]≦a[1]≦a[2]≦a[3]≦………≦a[n-1]

繰り返しと分岐を使って,この性質をどのよ
うに定義するか?(アルゴリズムの決定)
単純な並べ替え


性質の定義
a[i], 0≦i≦n-1, において
0≦i≦n-1 : a[0]が最小
1≦i≦n-1 : a[1]が最小
2≦i≦n-1 : a[2]が最小
…
n-2≦i≦n-1 : a[n-2]が最小
単純ソート

性質をフローチャートで記述
0≦i≦n-2
i~n-1において
a[i]がmin
Y
N
i~n-1において
minの要素a[k]を
検出
a[i]とa[k]を
交換する
基本バブルソート



性質の定義
a[i], 0≦i≦n-1, において,常に
次の関係が成り立つ。
a[i]≦a[i+1], 0≦i≦n-2
逐次検索法


検索キーとデータとを,順番に最初から比較して
いく方法です。
search1.javaを作成しましょう。
検索キーの入力
0≦i≦n-1
i番目のデータが
検索キーと一致し
たならば
Y
i番目のデータ
を出力
二分検索法




逐次検索法に比べ,比較の回数を大幅
に減少させることが出来る,高速な検索
アルゴリズムです。
まず最初にデータをソートしておきます。
中央要素と検索キーを比較します。
一致しない場合でも,その大小関係で,
次の検索範囲が右半分か左半分かが決
まります。急速に検索範囲が狭まります。
二分検索法の原理
search2.java
No.
データ
0
13
1
1
2
6
3
3
4
4
5
10
6
8
7
9
8
12
9
16
検索キーとして‘5’が入力されたとします。
No.
データ
0
1
1
3
2
4
3
6
4
8
5
9
6
10
7
12
8
13
9
16
検索範囲を左側のみとし
検索範囲を右側とし ‘5’よりも大きいので,‘5’は左側に
‘5’よりも小さいので,‘5’は右側に
あることになります。
中央値と‘5’と比較します
同じ処理を繰り返します。
処理を繰り返します。
あることになります。
中央値と‘5’と比較します