- ベストアンサー
クイックソート
クイックソートのプログラムを作ったのですがうまくいきません 汗 コンパイル時に sample1.c: In function ‘quicksort’: sample1.c:31: error: expected expression before ‘]’ token sample1.c:32: error: expected expression before ‘]’ token sample1.c:32: error: too few arguments to function ‘quicksort’ とでます。 まだアルゴリズムやCは勉強始めたばかりで基本的なところでつまって いるかもしれません。ご教授おねがいします。 /*クイックソート*/ #include<stdio.h> #define MAXDATA 10 #define swap(type,a,b) {type m; m = a; a = b; b = m;} void quicksort(int a[],int left ,int right) { int i,j,pivot; pivot = a[left]; i = left + 1; j = right; while(i <= j){ while(a[i]<pivot) i++; while(a[j]>pivot) j--; if(i<j){ swap(int,a[i],a[j]); i++; j--; } } swap(int,a[left],a[j]); quicksort(a[],left,j-1); quicksort(a[],j+1,right); } int main(void) { int k,j,sort[MAXDATA]; for(k=0;k < MAXDATA;k++) {printf("sort[%d]:",k); scanf("%d",&sort[k]);} for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); puts("ソートしますか? Yes:1 No:0 ///"); scanf("%d",&j); if(j==1){ quicksort(sort,0,MAXDATA-1); for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); } putchar('\n'); return(0); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
今現在質問者のプログラムがどの程度修正されているのか分かりませんが、提示されているプログラムを拝見する限り、いくつかバグがあるように感じます。 一点だけ申し上げますと、通常、再帰関数を作成する場合内部処理が2つ必要だと感じます。 例えば階乗の値を求めるプログラムが再帰関数の例としてよく取り上げられます。階乗の計算というのは5!=5×4×3×2×1というものです。 プログラムの例は、以下のようになります。 #include<stdio.h> int kaijou (int n) { if (n == 1) { /* 内部処理1 */ return 1 ; } else { /* 内部処理2 */ return n * kaijou (n - 1) ; } } int main(int argc, char* argv[]) { printf ("%d\n", kaijou (5)) ; return(0); } 質問者のプログラムは内部処理2しかないように思われます。 この場合、内部処理2しかないと5×4×3×2×1×0×(-1)×(-2)×(-3)×…といつまでたっても終わらなくなるように思いますが(実際にはそのうちにスタックがパンクしてエラーになるでしょうけど)。
その他の回答 (2)
- himajin100000
- ベストアンサー率54% (1660/3060)
未検討: quicksortに if (left + 1 > right){ return ; } 見たいなのがないと止まらないいんじゃないかな?これ。
お礼
返答送れてすみません。 再帰が止まらないですね 汗。何とか頑張って作ってみます。 ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6289)
>quicksort(sort,0,MAXDATA-1); ここではエラーが出ていないのに >quicksort(a[],left,j-1); >quicksort(a[],j+1,right); ここではエラーが出ていますね。 両者の違いをよく見比べてください。
お礼
あーわかりました。ただa[]をaでいれてコンパイルは 通ったのですが、 今度はセグメントエラーとなってしまいました。 もし原因がわかりましたら教えてください。
お礼
No.2さんがいわれているようなもので止めようと思います。 返答送れてすみません。ありがとうございました。