前提・実現したいこと
C言語で二分探索を実装したいです。
配列の中に探索している値があれば、配列の○番目で発見したと画面に表示したいです。
発生している問題・エラーメッセージ
配列の中に探索している値があるにもかかわらず、発見したと表示されません。
該当のソースコード
C
1#include <stdio.h> 2int main(void){//二分探索法 3 4 int array[7]={1,3,5,7,9,11,13}; 5 int lo=0, mid, hi=6; 6 int val=11;//探索したい値 7 8 while(lo > hi){ 9 mid = (lo + hi) / 2; 10 if(array[mid] < val){ 11 lo = mid + 1; 12 }else if(array[mid] > val){ 13 hi = mid - 1; 14 }else{ 15 printf("値「%d」は配列の[%d]番目で発見しました",val,mid); 16 } 17 } 18}
試したこと
おそらくwhile文内のif分岐が正しくないと推測し、修正していますがうまくいきません。
C
1if(array[mid] < val){ 2 lo = mid + 1; 3 }if(array[mid] > val){ 4 hi = mid - 1; 5 }if(array[mid] == val){ 6 printf("値「%d」は配列の[%d]番目で発見しました",val,mid); 7 }
↑これもうまくいかなかった例です。
補足情報(FW/ツールのバージョンなど)
実行環境はpaiza.ioです。
###修正中のコード
頂いた回答をもとに修正しました。探索したい値(val)が3,7,11なら正常に探索結果が表示され、
1,5,9,13なら、何も表示されない状況です。まだうまく動作しません。以下修正中のコードです。
C
1#include <stdio.h> 2 3int main(void){//二分探索法 4 5 int array[7]={1,3,5,7,9,11,13}; 6 int lo=0, mid, hi=6; 7 int val=11;//探索したい値 8 9 while(lo < hi){//継続条件修正済み 10 mid = (lo + hi) / 2; 11 if(array[mid] < val){ 12 lo = mid + 1; 13 }else if(array[mid] > val){ 14 hi = mid - 1; 15 }else{ 16 printf("値「%d」は配列の[%d]番目で発見しました",val,mid); 17 break;//追記 18 } 19 } 20}
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/25 06:59 編集
2020/07/26 02:45
2020/07/26 08:56
2020/07/26 09:10
2020/07/26 09:54