• ベストアンサー

上手くいかない

QNo.2985174で質問したものです 皆さんからいろいろなアイデアを頂きましたが、やはり並び替えを行ってはくれません どんなコトでも良いので、アドバイスをいただけると嬉しいです>< 前回の質問…http://oshiete1.goo.ne.jp/qa2985174.html?ans_count_asc=0 以下が現在のプログラムです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, last, t; for(last=(a+n); a<last; a++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } }

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

  • ベストアンサー
noname#246547
noname#246547
回答No.1

2箇所間違ってる >int *i, *min, last, t; int *i, *min, *last, t; lastはアドレスを格納したいので*を付ける! >t=*min; *min=*i; *i=t; t=*min; *min=*a; *a=t; 変数iは常にfor終了後配列の次のアドレスをさすので保護違反(確保したエリアの外を指している)してるし、そもそも、*minと*aを入れ替えないと。

dasaitama7
質問者

お礼

ありがとうございました! 上手くいきました 本当に助かりました

その他の回答 (1)

回答No.2

わけもわからずむやみにこねくりまわすのはやめて、 やりたいことを忠実に/素直に実装しましょうね。 #include <stdio.h> #include <stdlib.h> #define MAX 50 #define RandMax 1000 void select_sort(int *data, int n) {  int i;  for ( i = 0; i < n; ++i ) {   /* 暫定的にdata[i]が最小とする */   int min_value = data[i]; /* 最小値 */   int min_index = i; /* 最小値を持つ要素の添え字 */   int j;   /* 現在の最小値より小さい値が見つかったら更新する */   for ( j = i + 1; j < n; ++j ) {    if( min_value > data[j] ) {     min_value = data[j];     min_index = j;    }   }   /* 上で求めた data[i]~data[n-1] 中の    * 最小値をdata[i]と交換 */   data[min_index] = data[i];   data[i] = min_value;  } } main() {  int *a, i;  a=(int*)calloc(MAX,sizeof(int));  for(i=0; i<MAX; i++) {   a[i]=rand()%RandMax;  }  select_sort(a, MAX);  printf("data size=%d \n", MAX);  for(i=0; i<MAX; i++){   printf("%5d", a[i]);   if(i%10==9) printf("\n");  }  free(a); }