- 締切済み
マージソートについて。
マージソートについて勉強しており、プログラムを作ってみたのですが どうしてもcc=~~の箇所の数値がおかしく表示されてしまいます #include<stdio.h> int main(void) { int a[5]={20,40,15,35,50}; int b[3]={55,20,65}; int c[8]; int i,z,k; printf("a="); for(i=0;i<5;i++) { printf("%d ",a[i]); } printf("\nb="); for(z=0;z<3;z++) { printf("%d ",b[z]); } while(i <= 5 && z <= 3){ if(i < z){ a[i]=c[k]; i++; } else if(i > z){ b[z]=c[k]; z++; } } while(i<5 && z<3) { i=k; i++; z=k; z++; } printf("\nc=") ; for(k=0;k<8;k++) { printf("%d ",c[k]); } return 0; } ご教授していただければ幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
・分かり易さを第一に・・・暇な年寄りが。 (質問者様は何か勘違いをされているのでは。cが未定義なのに右辺にありますよ) #include <stdio.h> void main( void ) { int a[5] = { 20, 40, 15, 35, 50 }; int b[3] = { 55, 20, 65 }; int c[8]; int iA, iB, j, iMinA, iMinB, iBasyoA, iBasyoB; // 表示部省略 for( j = 0; j < 8; j++ ){ iMinA = 999; iMinB = 999; for( iA = 0; iA < 5; iA++ ){ // a[]最小抽出 if( a[iA] < iMinA ){ iMinA = a[iA]; iBasyoA = iA; } } for( iB = 0; iB < 3; iB++ ){ // b[]最小抽出 if( b[iB] < iMinB ){ iMinB = b[iB]; iBasyoB = iB; } } if( iMinA <= iMinB ){ // 相互比較=マージ? c[j] = iMinA; a[iBasyoA] = 99999; } else{ c[j] = iMinB; b[iBasyoB] = 99999; } } for( j = 0; j < 8; j++ ) printf( "[%d]=%d\n", j, c[j] ); } 注:タブの替わりに全角空白を用いています。
- sakusaker7
- ベストアンサー率62% (800/1280)
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1113485021 の方でしょうか。差し支えなければその参考書とやらのタイトル等を教えていただけませんか? 質問にあるプログラムを見た感じ、外部マージソートのやり方とか 自然マージソートを配列に対して使おうとしているように思えます。 ただ、アルゴリズムの参考書でも自然マージソートや外部ソートとしての マージソートを解説しているのは現状ではほとんど見受けられないので 気になります。 また、連結リストに対して使うのなら見覚えがありますが 配列が対象というのは意外に感じます。
- koko_u_
- ベストアンサー率18% (459/2509)
何がしたいのかまったくわかりません。 配列 a と b を印字した時点で、カウンタ i と z は各々 5 と 3 になっています。 次の while ( i <= 5 && z <= 3 ) { } の本体は 1回だけ実行され、b[3] に c[k] を代入しています。 しかるに k も c[k] も初期化されていないため、単に b[3] の値を破壊しているのみです。 つぎの while( i < 5 && z < 3 ) { } の本体はもちろん一度も実行されません。 徹頭徹尾、配列 c には何も格納していないため、印字した内容は不定です。 マージソートがどうこう言う以前の段階に見受けられます。