質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

1回答

541閲覧

100から10000までのソートの比較回数と交換回数を正しく表示させたい

0623

総合スコア0

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2022/06/20 02:45

100から10000までのランダム、降順、昇順の比較回数と交換回数を表示させたいのですが、プログラムを実行したところ、比較回数と交換回数が全部0になってしまいます。修正箇所を教えて欲しいです。

#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_ELEMENTS 10000 /* 最大のデータ数 */ #define OFFSET 100 /* データ数の増分値 */ #define MAX_LINES 10 /* 関数の最大行数 */ #define MAX_HEAP 1000 int a[MAX_ELEMENTS] ; /* 探索するデータ領域 */ int comp, swap ; /* 比較回数、交換回数を格納する変数 */ void downheap(int from,int to); void init_step(void); void print_step(int); void print_header(char *); int sorted(int); int main(void){ int i; int n; /* データ数 */ srandom(time(0)); /* 乱数の種を初期設定する */ /* ランダム入力の場合 */ print_header("random"); for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { init_step(); /* comp, swap の初期化 */ for (i = 0; i < n; i++) { a[i] = random() % n ; /* 配列要素に乱数値を設定する */ } downheap(0,n); /* ヒープソートを実行 */ /* ここに降順のチェックをいれる */ /* ここまでに降順のチェックをいれる */ print_step(n); /* 比較回数、交換回数の表示 */ } /* 昇順にソートされた入力の場合 */ print_header("ascending order"); for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { init_step(); /* comp, swap の初期化 */ for (i = 0; i < n; i++) { a[i] = i ; /* 配列要素に昇順のデータ値を設定する */ } downheap(0,n); /* ヒープソートを実行 */ /* ここに降順のチェックをいれる */ /* ここまでに降順のチェックをいれる */ print_step(n); /* 比較回数、交換回数の表示 */ } /* 降順にソートされた入力の場合 */ print_header("descending order"); for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) { init_step(); /* comp, swap の初期化 */ for (i = 0; i < n; i++) { a[i] = n - i ; /* 配列要素に降順のデータ値を設定する */ } downheap(0,n); /* ヒープソートを実行 */ /* ここに降順のチェックをいれる */ /* ここまでに降順のチェックをいれる */ print_step(n); /* 比較回数、交換回数の表示 */ } return 0; } void init_step(void){ swap = 0; comp = 0; } void print_header(char *s) { printf("%s\n n, 比較回数, 交換回数, チェック",s); printf("\n"); } void print_step(int n){ printf("%4d, %8d, %8d", n, comp, swap); if (sorted(n)) { /* 配列が昇順に整列されているかチェック */ printf(", sorted\n"); } else { printf(", unsorted\n"); } } int sorted(int n) { int i; for (i=0; i < n-1; i++) if (a[i] > a[i+1]) return 0; return 1; } int n = 0; void downheap(int from,int to) { int i, j; int val; int comp=0; val = a[from]; i = from; while (i <= to/2){ j = i*2; comp++; if (j+1 <= to && a[j] > a[j+1]) j++; if(val <= a[j]) break; a[i] = a[j]; i = j; } a[i] = val; } void heapsort() { int i; int tmp; int swap=0; for (i = n/2; i >= 1; i--) downheap(i,n); for (i = n; i >= 2; i--){ swap++; tmp = a[1]; a[1] = a[i]; a[i] = tmp; downheap(1, i-1); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

gcc でしたら、コンパイルするときに -Wall -Wshadow を付けるのがおすすめです。

c

1void downheap(int from,int to) 2{ 3 int i, j; 4 int val; 5 int comp=0;

この関数で更新している comp はローカル変数です。グローバル変数 comp ではありません。このローカル変数の宣言を消せば意図通りになりそうです。

c

1 void heapsort() 2 { 3 int i; 4 int tmp; 5 int swap=0;

この swap も同様です。

投稿2022/06/20 03:31

編集2022/06/20 03:34
int32_t

総合スコア20874

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0623

2022/06/20 03:37

事前にローカル関数を消した状態で試しましたができませんでした。
int32_t

2022/06/20 03:42

試したことは質問文に書いておいてくださいね。
int32_t

2022/06/20 03:55

コードを見直してみましたが、ローカル変数削除で comp は必ず1以上になるはずです。 swap は 0 のままで正しいです。関数 heaepsort() は使われていないので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問