- 締切済み
このプログラムの間違えって??
このクイックソートプログラムうまくいかないのですがどこかちがいますか?? quicksort(inta[], intl, intr){ intv, i, j, t; if (r > l) { v = a[r]; i = l-1; j = r; for (; ;) { while (a[++i] < v) ; while (a[--j] > v) ; if (i >= j) break; swap(&a[i],&a[j]); } swap(&a[i],&a[r]); quicksort(a, l, i-1); quicksort(a, i+1, r) } }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- SilverThaw
- ベストアンサー率32% (260/806)
No.1です。 No.3に追記 >このクイックソートプログラムうまくいかないのですがどこかちがいますか?? 「うまくいかない」といっている ・ソート前のデータ ・ソート後の結果 も提示してください。 関数の処理ではなく「関数の呼び方」や「結果の確認方法」というものも疑うべき項目です。
- akayoroshi
- ベストアンサー率50% (46/91)
#2で回答した者です。 void swap( int* x, int* y ); void quicksort(int a[], int l, int r){ int v, i, j, t; if (r > l) { v = a[r]; i = l-1; j = r; for (; ;) { while (a[++i] < v) ; while (a[--j] > v) ; if (i >= j) break; swap(&a[i],&a[j]); } swap(&a[i],&a[r]); quicksort(a, l, i-1); quicksort(a, i+1, r); } } これにswap関数の定義を追加して、乱数を使ってテストしました。正しく動作しました。
- SilverThaw
- ベストアンサー率32% (260/806)
No.1です。 >根本的に無理みたいなのですが何かおもいあたりませんか?? ですから、 >これを呼び出す元のプログラムも提示してください。 >それとswap()は開発環境の標準関数ですか? と回答しています。 思いつくのはそのあたりですから。
- akayoroshi
- ベストアンサー率50% (46/91)
文法エラーがあります。 戻り値の型 void 変数宣言の型名と変数名の間の区切り文字 int a[], int l, int r 同じく int v 最後の式文の後のセミコロン quicksort(a, i+1, r); これを直して、swap関数を正しく作り、このquicksort関数を正しく引用すれば正しくソートできます。
補足
回答ありがとうございます。 文法はこちらの記述ミスです。 根本的に無理みたいなのですが何かおもいあたりませんか?? ちなみに値は乱数でとります
- SilverThaw
- ベストアンサー率32% (260/806)
>うまくいかないのですがどこかちがいますか?? これを呼び出す元のプログラムも提示してください。 それとswap()は開発環境の標準関数ですか? 尚、提示ソースそのままなら、構文ミスでコンパイルすら通らないはずですよ。
補足
回答ありがとうございます。 説明不足でした。 正しくは時々セグメントエラーが出るのです。 それで聞いてみたところイックソートプログラムがおかしいいわれたのですがどの辺がまずいのでしょうか?? 環境はUNIXです。