アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
C言語を勉強していまして授業課題でクイックソート(再帰型)の比較総数を計算する問題が正答しません。カウントの仕方をご教示いただけましたら幸いです。
何卒よろしくお願いいたします。

typedef int value_type;

value_type med3(value_type x, value_type y, value_type z) {

if (x < y) {
if (y < z) return y;
else if (z < x) return x;
else return z;

} else {

if (z < y) return y;
else if (x < z) return x;
else return z;
}
}


// [quicksort ] a = 対象配列 left = 開始位置 right = 終了位置

void quicksort(value_type a[], int left, int right) {
if (left < right) {
int i = left, j = right;
value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2
while (1) { // a[] を pivot 以上と以下に分ける
while (a[i] < pivot) i++; // a[i] >= pivot 位置検索
while (pivot < a[j]) j--; // a[j] <= pivot 位置検索
if (i >= j) break;
tmp = a[i]; a[i] = a[j]; a[j] = tmp; // a[i], a[j] 交換
i++; j--;
}
quicksort(a, left, i - 1); //分けた左側--再帰並べ替え
quicksort(a, j + 1, right); //分けた右側--再帰並べ替え
}
}

質問者からの補足コメント

  • zircon3様
    おっしゃられた通りです。
    while( 条件式 )の中のこれから比較しますよと言うのを総比較数と言います。比較した結果は条件に合致したものだけでした。
    大切なことを気づかせていただき深く御礼申し上げます。

    ベストアンサーに選ばせていただきました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/07/18 14:31

A 回答 (1件)

まず、処理手順を日本語で考え、それを日本語の箇条書きや何らかのチャート図(ご存じなら)に書き表しましょぅ。


その際、「比較回数」とは何処で何をカウントすればよいかを考えましょう。
注意点としてはif条件に当てはまらなかった場合、whileループの脱出条件に該当した場合も「比較回数」に入らないのか?。。。という点です。そこをしっかり考えてとはどこの何をカウントすればよいかを決めましょう。

プログラムは思った通りには動きません。作った通りに動きます。
それを念頭に不備な点を洗い出しましょう。

[蛇足]
ソースコードを書く際はタブ付けを上手に使うとある{}の範囲がどこからどこまでなのかがわかりやすくなり焼いた後に読みやすくかつミスを防ぎやすいものとなります。
あと、関数中で使用する変数はその変数が必要になったところで宣言するのではなく、関数の最初で宣言しましょう。構造的にもスッキリし、後から読みやすいものとなります。

参考まで。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ご丁寧に教えていただきましてありがとうございます。
一度チャート図を書いて再度整理したいと思います。

「if条件に当てはまらなかった場合、whileループの脱出条件に該当した場合」
↑↑↑
ここだと思います。見逃していました。比較という意味を理解しておりませんでした。
タブ付けとは コメントのことでしょうか?
すこし調べさせていただきます。
微に細にご指導いただき感謝申し上げます。
助かりました。

お礼日時:2018/07/18 11:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!