• ベストアンサー

クイックソートプログラムでセグメンテーション違反がでるのですが

クイックソートのプログラムを作成したのですが、 実行するとセグメンテーション違反が発生して、上手くいきません。何処に原因があるのでしょうか? また、セグメンテーションン違反とはどういったころなのでしょうか? アドバイス宜しくお願いします。 #include <stdio.h> int quick_sort(int *a,int start,int end); int partition(int *a,int start,int end); main() { int n; int a[n]; int i; printf("ソートしたい要素の個数は?\n"); scanf("%d",&n); for(i=0;i<=n-1;i++) a[i]=0; for(i=0;i<=n-1;i++){ printf("%dのデータを入力してください。\n",i+1); scanf("%d",&a[i]); } printf("ソート前のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); quick_sort(*a,1,n-1); printf("ソート後のデータは以下の通り\n"); for(i=0;i<=n-1;i++) printf("%d ",a[i]); } int quick_sort(int *a,int start,int end) { int pivot; if(end-start>0){ pivot=partition(a,start,end); quick_sort(a,start,pivot-1); quick_sort(a,pivot+1,end); } } int partition(int *a,int start,int end) { int i,j,pivot,tmp; i=start-1; j=end; pivot=a[end]; while(1){ while(a[++i]<pivot); while(i<--j && a[j]>pivot); if(i>=j) break; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } a[end]=a[i]; a[i]=pivot; return i; }

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

実行すると…って、これコンパイルできたのですか? こちらでコンパイルするとエラーが二つでます。 一つめはmainの最初の方のint a[n];の宣言で、 配列長宣言は定数でないといけません。(通常のコンパイラでは) 正しく直すなら、malloc()を使って動的に配列を確保するのですが… ここは応急処置として int a[100]; ぐらいにして、100以上の個数は指定しないようにするといいでしょう。 もう一つは、mainの中程の quick_sort(*a,1,n-1); の呼び出しのところです。 *aとすると、配列aの最初の要素を意味するので、 *はいりません。 quick_sort(a,1,n-1); とします。 流れを詳しくは見ていませんが、 以上2箇所の修正をして、こちらでは動きました。 なお、セグメンテーション違反とは簡単に言えば 「プログラムが使っていい範囲以外のメモリを使ってしまった」 という意味です。

linuxbeginner
質問者

お礼

ありがとうございます。 この点は私のしようしているコンパイラでは問題ありませんでしたが、良くなさそうですね。次回からはmalloc()の使い方を覚えて、それを使おうと思います。 >>一つめはmainの最初の方のint a[n];の宣言で、 >>配列長宣言は定数でないといけません。(通常のコンイ >>ラでは) >>正しく直すなら、malloc()を使って動的に配列をす >>るのですが… あ、そうでした。*aでは駄目ですよね。プロトタイプの時には*aと書かないといけないので、つい間違えてしまいました。 >>もう一つは、mainの中程の >>quick_sort(*a,1,n-1); >>の呼び出しのところです。 >>*aとすると、配列aの最初の要素を意味するので、 >>*はいりません。 >>quick_sort(a,1,n-1); >>とします。 アドバイスの通り修正したら、正常に動作しました。 ありがとうございます。

その他の回答 (1)

  • nori_6576
  • ベストアンサー率28% (6/21)
回答No.2

linuxbeginnerさん、ってことで、Linux上のgcc 3.2で試しました。 以下の2箇所を修正すれば、正常動作しました。 quick_sort(*a,1,n-1); --> quick_sort(a,0,n-1);

linuxbeginner
質問者

お礼

良く考えてみたら、2つめの引数が1だと、最初のa[0]がソートされませんね。というわけで、0に訂正しました。 どうもありがとうございます。

関連するQ&A

専門家に質問してみよう