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