[909] Re:C言語体当たり学習
投稿者:(ぱ)こと管理人
2007/02/20 02:13:25
>p106のmy_sort5.cのソースコード36行目から始まる単純挿入ソートなのですが、
>誤:for(sorted_count = 0; sorted_count < score_count; sorted_count++) {
>正:for(sorted_count = 0; sorted_count < score_count - 1; sorted_count++) {
>ではないでしょうか(判定条件の-1が抜けてる)。
>誤りと思われるコードでは、配列の範囲外を(配列の要素数より1つ分多く)
>参照してしまうと思います。
my_sort5.cは挿入ソートではなく、単純選択ソートですね。
ソースを確認しましたが、
(1)条件は「<」なのですから、sorted_countのループ内での最大値は
score_count-1です。よって、score[sorted_count]で参照する限り、
範囲外を参照することはありません。
(2)38行目からのループは、
for (i = sorted_count + 1; i < score_count; i++) {
で始まっています。iがsorted_count + 1から始まりますが、
sorted_countが最大のとき、このループは1回も回らないので、score[i]で
範囲外が参照されることもありません。
ただ、単純選択ソートの原理は「未ソート部分から最小値を探してきて左端に持ってくる」というものですから、最後にひとつ残された未ソートの要素は最大値に決まっているので、無駄といえば無駄ではあります。現状のソースだと43~45行目のスワップで、必ず同じ変数をひっくり返します。
これはバグとは思いませんが、補足かなにかで書いておいた方がよいかもしれませんね(今日は時間が時間なのでアレですが)。
ご意見ありがとうございました。