質問: ### 前提・実現したいこと 大学のC言語の課題で自分で配列を作ってクイックソートを行い、それをかかった時間とともに表示する(ただしpivotは配列の両端と中央での値の3個の値の中央値とする)プログラムを作成したいです。 ### 発生している問題・エラーメッセージ ピボットをを両端と中央での値の3個の値の中央値として実装したいけどSegmentation fault: 11と出てきてしまいどこがダメなのかがわからないです。 ``` ./a.out How many arraysize do you want? 100 before sort 1 57 56 1 65 7 98 62 49 14 29 70 71 80 93 46 5 54 11 95 90 59 14 55 41 86 67 26 90 70 93 87 89 83 14 70 29 19 90 61 77 76 5 2 41 75 27 22 60 11 55 54 6 3 35 17 27 36 69 27 49 63 39 12 3 33 34 18 53 89 92 58 42 99 55 71 83 11 49 4 36 11 3 99 99 4 43 60 90 2 82 46 69 29 45 3 99 0 75 68 sorting・・・ Segmentation fault: 11 ``` ### 該当のソースコード ```C言語 include include include int nrandom(); int *make_data(); void showdata(); int pivot_midium(int x,int y,int z){ /* x is left y is middle z is right */ if((x>=y && x<=z) || (x<=y && x>=z)) return x; else if((y>=x && y<=z) || (y<=x && x>=z)) return y; else return z; } int nrandom(int n){ return (int)(n*(double)rand()/((double)RAND_MAX+1.0)); } int *make_data(unsigned int s,int n){ int i,*data; srand(s); data=(int *)malloc(n*sizeof(int)); for(i=0;ipivot) j--; if(i>=j) break; tmp=a[i]; a[i]=a[j]; a[j]=tmp; i++; j--; } if(left
回答: また pivot_midium 内での if の条件ですが, このように複数の変数の関係を記述する場合, 不等号の向きを一致させると式が纏まり, 分かり易くなると思います. x, y, z で中間の値を求める場合, 左(もしくは右)から小,中,大となる関係として書きます. 例えば x が中間の場合に !0 となる条件(y<=x<=z or z<=x<=y): `(x>=y && x<=z) || (x<=y && x>=z)` → `(y<=x && x<=z) || (z<=x && x<=y)` y が中間の場合に !0 となる条件(x<=y<=z or z<=y<=x): `(y>=x && y<=z) || (y<=x && x>=z)` → `(x<=y && y<=z) || (z<=y && y<=x)` です. y<=x<=z → `y<=x && x<=z` と変数の並びが一致し, 式通りに書くことが出来ます.