196個の要素のあるdouble配列をクイックソートで大きい順に並べようとしています.しかし,実行するとsegmentation fault が起こります.常に起こるわけでもなく,上手く行くときもあるのですが,その時もどうも惜しい感じで,完全にソートされません.実はソートは自分で組む気は無く,インターネットで漁ったものを利用したのですが,segmentation faultが起こったので,quick_sort関数のifの条件式を left<right から (right-left)>1 と変えたのですが,やはりそれが完全にソートされない原因でしょうか.
コード必要な部分のみ記述します.
呼び出し部分も追記します.
eigenValとeigenVec[]が1対1対応で,eigenVec[]も一緒にソートされて欲しいためにsortIndex[]は置いています.
C
1#define CTGRY 46 2#define FTRDIM 196 3 4void swap (double *x, double *y) { 5 double temp; 6 7 temp = *x; 8 *x = *y; 9 *y = temp; 10} 11 12int partition (double *array, int left, int right,int *sortIndex) { 13 int i, j, pivot; 14 i = left; 15 j = right + 1; 16 pivot = left; 17 18 do{ 19 do { i++; } while (array[i] > array[pivot] ); 20 do { j--; } while (array[pivot] > array[j] ); 21 22 if (i < j) { 23 swap(&array[i], &array[j]); 24 sortIndex[i]=j; 25 sortIndex[j]=i; 26 } 27 }while(i<j); 28 29 swap(&array[pivot], &array[j]); 30 sortIndex[pivot]=j; 31 sortIndex[j]=pivot; 32 33 return j; 34} 35 36void quick_sort (double *array, int left, int right,int *sortIndex) { 37 int pivot; 38 39 if (right>left) { 40 pivot = partition(array, left, right,sortIndex); 41 quick_sort(array, left, pivot-1,sortIndex); 42 quick_sort(array, pivot+1, right,sortIndex); 43 } 44} 45 46void ReadEigenVV( double EigenVal[CTGRY][FTRDIM], double EigenVec[CTGRY][FTRDIM][FTRDIM] ) 47{ 48 FILE *fp; 49 int sortIndex[FTRDIM]; 50 fp=fopen(EIGENVV,"r"); 51 if(fp==NULL){ 52 printf("cannot open %s",EIGENVV); 53 exit(0); 54 } 55 int i,j,k; 56 for(i=0;i<FTRDIM;i++) sortIndex[i]=i; 57 58 for(i=0;i<CTGRY;i++){ 59 for(j=0;j<FTRDIM;j++) 60 fscanf(fp,"%lf",&EigenVal[i][j]); 61 62 quick_sort(EigenVal[i],0,FTRDIM-1,sortIndex); 63 64 for(j=0;j<FTRDIM;j++) 65 for(k=0;k<FTRDIM;k++) 66 fscanf(fp,"%lf",&EigenVec[i][sortIndex[j]][k]); 67 68 for(j=0;j<FTRDIM;j++) 69 printf("%d:%lf\n",j,EigenVal[i][j]); 70 71 } 72 73}
qsortを使ってみてはとの提案があったのでその方法でも書いてみましたが,こちらはこちらでsegmentation faultは起きてしまいます...
c
1#define EIGENVV "eigenvv.dic" 2#define CTGRY 46 3#define FTRDIM 196 4 5typedef struct 6{ 7 double eigenVal; 8 double eigenVec[FTRDIM]; 9}eigenSet; 10 11 12int compare(const void *a,const void *b){ 13 double A= ((eigenSet *)b)->eigenVal; 14 double B= ((eigenSet *)a)->eigenVal; 15 16 if(A>B){ 17 return -1; 18 }else if(A<B){ 19 return 1; 20 }else{ 21 return 0; 22 } 23} 24 25void ReadEigenVV( double EigenVal[CTGRY][FTRDIM], double EigenVec[CTGRY][FTRDIM][FTRDIM] ) 26{ 27 FILE *fp; 28 fp=fopen(EIGENVV,"r"); 29 if(fp==NULL){ 30 printf("cannot open %s",EIGENVV); 31 exit(0); 32 } 33 int i,j,k; 34 eigenSet eSet[FTRDIM]; 35 36 for(i=0;i<CTGRY;i++){ 37 for(j=0;j<FTRDIM;j++) 38 fscanf(fp,"%lf",&EigenVal[i][j]); 39 for(j=0;j<FTRDIM;j++) 40 eSet[j].eigenVal=EigenVal[i][j]; 41 42 for(j=0;j<FTRDIM;j++) 43 for(k=0;k<FTRDIM;k++) 44 fscanf(fp,"%lf",&EigenVec[i][j][k]); 45 for(j=0;j<FTRDIM;j++) 46 for(k=0;k<FTRDIM;k++) 47 eSet[j].eigenVec[k]=EigenVec[i][j][k]; 48 49 50 qsort(eSet,FTRDIM,FTRDIM*sizeof(eigenSet),compare); 51 52 for(j=0;j<FTRDIM;j++) 53 EigenVal[i][j]=eSet[j].eigenVal; 54 for(j=0;j<FTRDIM;j++) 55 for(k=0;k<FTRDIM;k++) 56 EigenVec[i][j][k]=eSet[j].eigenVec[k]; 57 58 for(j=0;j<FTRDIM;j++) 59 printf("%d:%lf\n",j,EigenVal[i][j]); 60 61 } 62 63}

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。