• 締切済み

クイックソートのプログラムを実行するとエラーが出る

プログラミング初心者のものです。 ソースのファイル名はquicksortという名前にして、コンパイル&実行すると、 「Quicksortが原因でQUICKSORT.EXEにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と、 「Quicksortが原因でKERNEL32.DLLにエラーが発生しました。Quicksortは終了します。問題が解決しない場合は、コンピュータを再起動してください。」 と言うエラーが出てきて最後まで実行されません。 どうしてでしょうか?ちなみにソースは以下のものです。 #include<stdio.h> #define N 10 void quicksort(int a[],int first,int last) { int i,j,p,w,k; k=(first+last)/2; p=a[k]; i=first; j=last; while(i<=j){ while(a[i]<p){ i++; } while(a[j]>p){ j--; } w=a[i]; a[i]=a[j]; a[j]=w; i++; j--; } if(first>j){ quicksort(a,first,j); } if(last>i){ quicksort(a,i,last); } } main() { int a[]={18,97,59,72,5,38,11,43,67,26}; int i; printf("Before:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); quicksort(a,0,N-1); printf("After:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); return(0); }

みんなの回答

noname#50176
noname#50176
回答No.3

#include "stdafx.h" #include<stdio.h> #define N 10 void quicksort(int a[],int first,int last) { int i,j,p,w,k; if (!(last-first & -2)) return; k=(first+last)/2; p=a[k]; i=first; j=last; while(i<=j){ while(a[i]<a[k]){ i++; } while(a[j]>a[k]){ j--; } if (i==j) break; w=a[i]; a[i]=a[j]; a[j]=w; i++; j--; if (j<=k) j=last; if (i>=k) i=first; } quicksort(a,first,j); quicksort(a,i,last); } main() { int a[]={18,97,59,72,5,38,11,43,67,26}; int i; printf("Before:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); quicksort(a,0,N-1); printf("After:"); for(i=0;i<N;i++){ printf("%4d",a[i]); } printf("\n"); return(0); } に修正し、動作しました。 修正点は 1.無限ループを誘う条件の排除 2.ピボットの変則的対応 3.リピーティング処理の排除(無意味な同じ処理排除) です。 参考になればいいのですが・・・。

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

> if(first>j){ > quicksort(a,first,j); > } 不等号の向きは正しいでしょうか?

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

デバッガ(gdb)で追っかけてみると、 > #0 0x00401ba1 in quicksort (a=0x81ff54, first=0, last=-1) at a.c:24 > #1 0x00401ba6 in quicksort (a=0x81ff54, first=0, last=-1) at a.c:24 (以下略) と出ます。 再帰の終了条件もしくは添え字の計算がおかしいのではないかと。

関連するQ&A