前提・実現したいこと
c言語でデータを昇順にする挿入ソートを実装し、その挿入ソート内で比較操C作と交換操作が何回行われているのかを計測したい。
###問題
現状のコードでは、交換回数(s[3])は正しく計測できているのですが、比較回数(s[2])が正しく計測できていません。
どうやらwhile文全体ではなく、while文の2つ目の条件(array[j - 1] > array[j])の部分(比較操作)の回数を計測しないといけないようなのですが、どのようにコードを改良してもうまくいきません。
どうすればできるのかご教授願います。
該当のソースコード
c
1void insert_sort(int array[], int array_size){ 2 int i,j; 3 int tmp; 4 5 s[0]++; for(i = 1; i < array_size; i++){ 6 s[1]++; j = i; 7 s[2]++; while((j >= 0) && (array[j - 1] > array[j])){ 8 s[3]++; tmp = array[j]; array[j] = array[j - 1]; array[j - 1] = tmp; 9 s[4]++; j--; 10 s[5]++; } 11 s[6]++; } 12}
試したこと
試しにwhile文のところを以下のように2つに分割してみたのですが、データそのものが既に昇順になっている場合に、比較操作(s[3])が(データ数が100のとき)5049回行われていることになってしまいました。
昇順挿入ソートにおいて入力データが既に昇順だった場合、比較回数はデータ数Nに対し、N-1回だと認識しているのですが、私の認識と5049回という実行結果のどちらが正しいのでしょうか。
c
1void insert_sort(int array[], int array_size){ 2 int i,j; 3 int tmp; 4 5 s[0]++; for(i = 1; i < array_size; i++){ 6 s[1]++; j = i; 7 s[2]++; while(j >= 0){ 8 s[3]++; while(array[j - 1] > array[j]){ 9 s[4]++; tmp = array[j]; array[j] = array[j - 1]; array[j - 1] = tmp; 10 s[5]++; } 11 s[6]++; j--; 12 s[7]++; } 13 s[8]++; } 14}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/10 07:58