• 締切済み

クイックソートがうまくいかない

クイックソートの仕様はこうです。 (1)バラバラにランダムで入力した配列から基準値を設定する。 (2)前から順番に辿って行って基準値よりも大きいならば、基準値よりも後に移動、小さいならば、基準値よりも前に移動させる。(私のプログラムの場合は基準値を配列の一番目の数に設定しています。) (3)小さいほうと大きいほうの二つのグループに分かれたらまたそれらのグループごとにクイックソートにかける。 (4)二つのグループを分けることができなくなればソート完了。 動作させてみたところ関数QuickSortの中の「基準値より大きいか小さいかの仕分けの処理」の後で、再帰処理があるのですが、再帰ではなく無限ループになってしまっているようです。 自分では、この処理で無限ループをとめているつもりです。 if(youso==1) { return; } なぜこのようになってしまうのでしょうか お手数ですが、よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define N 10 int k,q; void QuickSort(char mi,char hai[10],int youso) { char shoubox[10]; char bigbox[10]; int i,len,len2; k=0,q=0; /*もし配列haiの大きさが1ならば終了*/ if(youso==1) { return; } /*配列の2番目から最後まで基準値からの大小により仕分けしていく。大きいならば、配列bigboxに小さい*/ /*ならば配列shouboxにそれぞれ入れる。*/ for(i=1;i<youso;i++) { if(hai[i]>mi) { bigbox[k++]=hai[i]; } else { shoubox[q++]=hai[i]; } } /*仕分け処理はここまで*/ /*小さいほうの配列と大きいほうの配列をそれぞれクイックソートにかける再帰処理。*/ QuickSort(shoubox[0],shoubox,q); QuickSort(bigbox[0],bigbox,k); /*それぞれのソートが完了したら、配列haiに「小さいほうの配列」→「基準値」→「大きいほうの配列」 の順に値を代入していく。*/ len=strlen(shoubox); for(i=0;i<len;i++) { hai[i]=shoubox[i]; } hai[len]=mi; len2=strlen(bigbox); for(i=(len+1);i<len+len2;i++) { hai[i]=bigbox[i]; } /*代入処理ここまで。*/ } int main(void) { char array[N]; char m; int i,val,j; srand(time(NULL)); /*(1~10)までの数字をランダムに入力する処理*/ for(i=0;i<N;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(val+'0'==array[j]) { break; } } }while(j<i); array[i]=val+'0'; } /*ランダムに値を入力する処理ここまで*/ m=array[0]; /*値配列の最初を基準値mに設定*/ QuickSort(m,array,N); /*基準値、配列、要素数を実引数として、クイックソートを呼び出す。*/ /*昇順に並べ替えた配列arrayを出力する。*/ for(i=0;i<N;i++) { printf("array[%d]=%c\n",i,array[i]); } return 0; }

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

>その通りなのですが、そのご指摘の意味がよくわからなかったのです。 理解できる回答がつくまで、繰り返すつもりなの? おみくじじゃないんだからさ。わからなかったら、そう返事を書こうよ。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

http://oshiete1.goo.ne.jp/qa5640305.html で「なんで strlen してるの?」って指摘されているにもかかわらず, 全く理解せずに締め切って新しく質問を立てた, という理解でいい?

rinnshan
質問者

お礼

不快にさせてしまい、大変申し訳ありませんでした。 >「なんで strlen してるの?」って指摘されているにもかかわらず, 全く理解せずに締め切って新しく質問を立てた, という理解でいい? その通りなのですが、そのご指摘の意味がよくわからなかったのです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

>int k,q; グローバル変数になっていますが、これだと >QuickSort(shoubox[0],shoubox,q); を実行した時点でkの値が変ってしまい >QuickSort(bigbox[0],bigbox,k); ではkはもう bigboxの要素数をあらわしていません。 > if(youso==1) 全てmiより大きい,または,全てmiより小さいときに youso == 0となりますが、そのときの事が考慮されていません。 > len=strlen(shoubox); > len2=strlen(bigbox); shoubox,bigboxそれぞれ後ろが'\0'になっているとは限らないので、strlenで数えることはできません。 それぞれの要素の数はq,kでわかっているはずです。 >for(i=(len+1);i<len+len2;i++) > hai[i]=bigbox[i]; bigboxが先頭([0])ではなく途中([len+1])からになっています。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>char array[N]; 関数内部の自動変数は、定義しただけだと何が入っているかわかりません。 その状態で、 >if(val+'0'==array[j]) 比較に使うと何が起きるかわかったものではありません。 クイックソート以前の話ではないかと思います。