ソート(並替え,整列) アルゴリズム...ソート(並替え,整列)...

23
ソート(並替え,整列) アルゴリズム ランダムに並んでいるデータを 値の小さい順(昇順), 大きい順(降順)に並べ替えること 学生を学籍番号順, 都市を人口の多い順, ...

Upload: others

Post on 27-Jan-2021

10 views

Category:

Documents


0 download

TRANSCRIPT

  • ソート(並替え,整列) アルゴリズム

    ランダムに並んでいるデータを 値の小さい順(昇順),

    大きい順(降順)に並べ替えること

    学生を学籍番号順, 都市を人口の多い順,

    ...

  • コンピュータはTunnel Vision トンネル視(棒視,視野狭窄症)

    • 人間:一度に全体を見渡して判断できる

    • コンピュータ:そんなグローバルな処理は (一度には)できない. ⇒2つのデータの大小比較しかできない ⇒アセンブリ言語命令は,一項演算か二項演算 ⇒局所的な処理を積み重ねてグローバルな 処理を実現する ⇒この実現方法を考えることが, アルゴリズムを考えるということ

  • 単純ソートの2つの基本処理

    ①2つのデータの大小比較

    ②(逆順なら)2つのデータを交換

  • バブルソート (隣接交換法)

  • バブルソートのアルゴリズム

    列の左端から始めて

    ① 隣接する2つのデータを比較.

    ② 左>右ならば入れ替え.左<右ならそのまま.

    ③ 右へ一つ移動して②を実行.

    ④ ソート済のデータに到達したら③を停止し, 左端に戻る.

  • 4要素のバブルソート

    ×

    a(0)

    ×

    a(1)

    a(2)

    a(3)

    a(0)

    ×

    a(1)

    ×

    a(2)

    a(3)

    a(0)

    a(1)

    ×

    a(2)

    ×

    a(3)

    a(0)

    1

    a(1)

    3

    a(2)

    4

    a(3)

  • バブルソートにおける 2種類のループ処理

    整列前 20 6 55 74 3 45 13 87 46 30

    内部ループ(Inner Loop) : 反復操作⇒2項比較 比較範囲はインクリメンタル

    外部ループ(Outer Loop): 反復操作⇒最大値を右端に追いやる スキャン(走査)範囲はデクリメンタル

    87

    74 87

    6 20 3 45 13 74 46 30

    隣接2データ比較・交換

    55

  • データ交換

    65 23

    a(2) a(3)

    a(2)の方がa(3)より大きいからデータを交換する a(2)=a(3)

    a(3)=a(2)

    とするとOKかな?

    だめ.バッファー(一時記憶)を使う b=a(2)

    a(2)=a(3)

    a(3)=b

  • i>=n-1

    a(i)>a(i+1)

    b=a(i)

    a(i)=a(i+1)

    a(i+1)=b

    n--

    i++

    前処理(初期化)

    外部ループ

    内部ループ

    隣接データ交換処理 大きい値がバッファを 通して一つ右へ移動

    インクリメンタル (隣接ペアを一つ右へずらす)

    デクリメンタル (走査範囲を一つ狭める)

    10個のデータのソート

    n=10

    no

    yes

    i=0

    n

  • バブルソート ハンドシミュレーション

    21 35 11 80 54

    1回目の処理結果? 21 11 35 54 80 2回目の処理結果? 11 21 35 54 80 3回目の処理結果? 11 21 35 54 80 4回目の処理結果? 11 21 35 54 80

  • 問題1:改良版バブルソート

    1,2,3,4,5,6,7,8,910 のような ソート済みのデータだと どうなりますか?

    上記をヒントにして、改良版 バブルソートの流れ図を示せ。

  • バブルソート改良版の解答例

    ソート済みか否かのフラグ変数を設け,事前に

    0とし,隣接データ交換処理をすればフラグ変

    数を1に更新する.

    このようにすれば,内部ループを抜け出した

    時,フラグ変数をチェックし,0であればソート済

    みとして停止すればよい.

  • 計算量 (Time Complexity)

  • 計算量

    ↓ 計算の手数がデータの個数nに対して どのように増えるか?

    あるアルゴリズムはどのくらい速いか? つまり、計算速度(計算時間)は?

    ↓ コンピュータ、OS、言語、コンパイラに 依存する

  • 計算量 「アルゴリズムAはアルゴリズムBの2倍速い」 という言い方ではだめなのか?(できないのか?)

    扱うデータ数が変わると速度比も変わる場合が あるため,あまり意味がない

    データ数Nと実行所要時間Tとの間の 一般的な関係を知りたい

  • 計算量(2)

    O(nの関数)の形で表す このとき、定数係数は無視する an2+bn+c O(n2)

    オーダーという オーダーが違う オーダーが1桁違う

  • 定数係数は無視する

    O(1) O(log n) O(n) O(n log n)

    O(n2 ) O(n3 ) 多項式オーダー ・・・ O( 2n) 指数関数的

    T(時間) = K * 1/2(N2-N) = K/2 * N2-NK/2

    バブルソートの場合

    Kはプロセッサの速度 など様々な現実状況 をあらわしている

    O(n2 )

  • (時間)計算量→ビッグO(オー)記法

    • OはOrderの意味.

    • アルゴリズムの実行時間は,コンピュータの性能に依存して変化する.実行時間実測値よりも,データ数と実行時間Tの関係が重要

    • よって,定数や低次項は無視して,最大次数項に注目して,それをオーダーと呼び,O(~)と表記する.

    • 記憶領域を議論するための領域計算量もあるが,ここでは時間計算量を計算量とよぶ.

  • ビッグオーのグラフ化

    N 5 10 15 20 25

    O(2n) 32 1024 32768 1048576 33554432

    O(N2) 25 100 225 400 625

    O(NlogN) 3.49 10 17.64 26.02 34.94

    O(N) 5 10 15 20 25

    O(logN) 0.69 1 1.17 1.30 1.39

    O(1) 1 1 1 1 1

  • O(1)

    O(logN)

    O(N)

    O(NlogN) O(N2) O(2n)

    ビッグオーの グラフ化

  • 計算量の求め方

    1.各処理実行回数を データ数Nで表現

    2.合計する

    3.最大次数に注目して ビッグOで表記.

    問題 左記の最大値選出 アルゴリズムの計算量を 求めよ.

  • バブルソートの計算量(オーダー)

    10,9,8,7,6,5,4,3,2,1 をバブルソートすると

    比較回数は? 9+8+7…=45

    交換回数は?9+8+7…=45

    よってN個のデータの場合

    問1:最大比較回数は?,最大交換回数は?

    問2:平均比較回数は?,平均交換回数は?

    問3:最小比較回数は?,最小交換回数は?

  • N個のデータのバブルソート

    比較 交換

    最大 (N-1)+(N-2)+…+1 =1/2N(N-1)=1/2(N2-N)

    O(N2 )ビッグオー記法

    (N-1)+(N-2)+…+1

    =1/2N(N-1)=1/2(N2-N)

    O(N2 )ビッグオー記法

    平均 (N-1)+(N-2)+…+1 =1/2N(N-1)=1/2(N2-N)

    O(N2 )ビッグオー記法

    ½*1/2(N2-N)=1/4(N2-N) O(N2 )ビッグオー記法

    最小 (N-1)+(N-2)+…+1 =1/2N(N-1)=1/2(N2-N)

    O(N2 )ビッグオー記法

    0