(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.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");のようになるだろう。