2007 年度「計算数学1」 2007-05-10

§47 余談 --- 素朴すぎるソート

(47.1) これでも一応ソートできるが、 前回述べたどの素朴なソートとも異なるものである。

    for (i = 1; i < N; i++) {
        for (j = 1; j < N; j++) {
            if (comp(j, j+1) > 0) {
                swap(j, j+1);
            }
        }
    }
比較回数が約 N2 回となるので、うまくない。

§48 二重ループのおさらい

(48.1) 諸君が書きかけた挿入ソートのプログラムを見ていると、 二重ループがまだよくわかっていない人がいるようだ。 少しやさしい例で復習しよう。

(48.2) 表

2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*6=36 6*7=42 6*8=48 6*9=54
7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
を出力するプログラムを書くとしよう。 これは九九の表だが、3*2 は 2*3 と同じだからという理由で省略し、 n の段は n*n 以降のみを書いたものである。 (昔はそう習ったらしい。 すなわち、昔は「8*3=24(はっさんにじゅうし)」などは習わなかったらしい。)

(48.3) これを書くときは、まず

    for (i = 2; i <= 9; i++) {
        /* ここで i の段を出力する */
    }
と考える。 そして、コメントを置いた部分に i の段を出力するループを書けばよいが、 そのときには i は定数と思って書く。 よって、たとえば
        for (j = i; j <= 9; j++) {
            printf("%d*%d=%2d ", i, j, i*j);
        }
        printf("\n");
のようになるだろう。


岩瀬順一