- ベストアンサー
上手くいかない
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"); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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を入れ替えないと。
その他の回答 (1)
- episteme_at_goo
- ベストアンサー率25% (9/36)
わけもわからずむやみにこねくりまわすのはやめて、 やりたいことを忠実に/素直に実装しましょうね。 #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); }
お礼
ありがとうございました! 上手くいきました 本当に助かりました