質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

解決済

double配列のクイックソート

削除済ユーザー
削除済ユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

4回答

0評価

0クリップ

1766閲覧

投稿2019/09/02 10:22

編集2022/01/12 10:58

196個の要素のあるdouble配列をクイックソートで大きい順に並べようとしています.しかし,実行するとsegmentation fault が起こります.常に起こるわけでもなく,上手く行くときもあるのですが,その時もどうも惜しい感じで,完全にソートされません.実はソートは自分で組む気は無く,インターネットで漁ったものを利用したのですが,segmentation faultが起こったので,quick_sort関数のifの条件式を left<right から (right-left)>1 と変えたのですが,やはりそれが完全にソートされない原因でしょうか.

コード必要な部分のみ記述します.

呼び出し部分も追記します.
eigenValとeigenVec[]が1対1対応で,eigenVec[]も一緒にソートされて欲しいためにsortIndex[]は置いています.

C

#define CTGRY 46 #define FTRDIM 196 void swap (double *x, double *y) { double temp; temp = *x; *x = *y; *y = temp; } int partition (double *array, int left, int right,int *sortIndex) { int i, j, pivot; i = left; j = right + 1; pivot = left; do{ do { i++; } while (array[i] > array[pivot] ); do { j--; } while (array[pivot] > array[j] ); if (i < j) { swap(&array[i], &array[j]); sortIndex[i]=j; sortIndex[j]=i; } }while(i<j); swap(&array[pivot], &array[j]); sortIndex[pivot]=j; sortIndex[j]=pivot; return j; } void quick_sort (double *array, int left, int right,int *sortIndex) { int pivot; if (right>left) { pivot = partition(array, left, right,sortIndex); quick_sort(array, left, pivot-1,sortIndex); quick_sort(array, pivot+1, right,sortIndex); } } void ReadEigenVV( double EigenVal[CTGRY][FTRDIM], double EigenVec[CTGRY][FTRDIM][FTRDIM] ) { FILE *fp; int sortIndex[FTRDIM]; fp=fopen(EIGENVV,"r"); if(fp==NULL){ printf("cannot open %s",EIGENVV); exit(0); } int i,j,k; for(i=0;i<FTRDIM;i++) sortIndex[i]=0; for(i=0;i<CTGRY;i++){ for(j=0;j<FTRDIM;j++) fscanf(fp,"%lf",&EigenVal[i][j]); quick_sort(EigenVal[i],0,FTRDIM-1,sortIndex); for(j=0;j<FTRDIM;j++) for(k=0;k<FTRDIM;k++) fscanf(fp,"%lf",&EigenVec[i][sortIndex[j]][k]); for(j=0;j<FTRDIM;j++) printf("%d:%lf\n",j,EigenVal[i][j]); } }

qsortを使ってみてはとの提案があったのでその方法でも書いてみましたが,こちらはこちらでsegmentation faultは起きてしまいます...

c

#define EIGENVV "eigenvv.dic" #define CTGRY 46 #define FTRDIM 196 typedef struct { double eigenVal; double eigenVec[FTRDIM]; }eigenSet; int compare(const void *a,const void *b){ double A= ((eigenSet *)b)->eigenVal; double B= ((eigenSet *)a)->eigenVal; if(A>B){ return -1; }else if(A<B){ return 1; }else{ return 0; } } void ReadEigenVV( double EigenVal[CTGRY][FTRDIM], double EigenVec[CTGRY][FTRDIM][FTRDIM] ) { FILE *fp; fp=fopen(EIGENVV,"r"); if(fp==NULL){ printf("cannot open %s",EIGENVV); exit(0); } int i,j,k; eigenSet eSet[FTRDIM]; for(i=0;i<CTGRY;i++){ for(j=0;j<FTRDIM;j++) fscanf(fp,"%lf",&EigenVal[i][j]); for(j=0;j<FTRDIM;j++) eSet[j].eigenVal=EigenVal[i][j]; for(j=0;j<FTRDIM;j++) for(k=0;k<FTRDIM;k++) fscanf(fp,"%lf",&EigenVec[i][j][k]); for(j=0;j<FTRDIM;j++) for(k=0;k<FTRDIM;k++) eSet[j].eigenVec[k]=EigenVec[i][j][k]; qsort(eSet,FTRDIM,FTRDIM*sizeof(eigenSet),compare); for(j=0;j<FTRDIM;j++) EigenVal[i][j]=eSet[j].eigenVal; for(j=0;j<FTRDIM;j++) for(k=0;k<FTRDIM;k++) EigenVec[i][j][k]=eSet[j].eigenVec[k]; for(j=0;j<FTRDIM;j++) printf("%d:%lf\n",j,EigenVal[i][j]); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。