• 締切済み

ポインターを使った並べ替え

ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, *last, t; last=a+n; for(i=a; i<last; i++){ 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"); } } 以上が私の作成したプログラムです よろしくお願いします

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★やっぱ min にセットした方がが効率がいいですね。 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;  } } ごめんなさい。

dasaitama7
質問者

お礼

何度もお返事いただいて、本当にありがとうございます! すごくありがたい限りです ですが、やはり並べ替えを行うプログラムにはなってくれません #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"); } } 現在はこのようになっているのですが、何かお気づきの点がありましたら教えてください><

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答者 No.1 です。追記。 ・a のポインタを直接・移動用ポインタに使えば良いのでは。  そうすれば min = a; や j ポインタを増やさなくても良かった気がします。  下のサンプルを。 void select_sort( int *a, int n ) {  int *i, *last, t;    for ( last = (a + n) ; a < last ; a++ ){   for ( i = a + 1 ; i < last ; i++ ){    if ( *i < *a ){     t = *a; *a = *i; *i = t;    }   }  } } 以上。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

バグの指摘は先にされたので別のところを。 for(i=a; i<last; i++){ min=a; for(i=a+1; i<last; i++) 内側のループの開始位置が 常に a + 1 というのと そこにはいる直前の min = a は ちょっと無駄があるかも。 要素が10個程度なら関係ないでしょうけど。 あとソートを行う関数の名前ですけど、 “select_sort” は変です。 Selection sort - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Selection_sort

dasaitama7
質問者

お礼

ご指摘ありがとうございます 検討してみます! (ソート名も含め…;;;)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★select_sort() 関数にバグが潜んでいます。 ・場所は for(i=a+1; i<last; i++) の部分です。  i ポインタは引数 a の移動用に使っていますので、もう一つポインタ j を用意して下さい。  つまり、下のようになります。 void select_sort( int *a, int n ) {  int *i, *min, *last, t;  int *j; ←追加    last = a + n;    for ( i = a ; i < last ; i++ ){   min = a;      for ( j = a + 1 ; j < last ; j++ ) ←j に変更    if ( *j < *min ) ←j に変更     min = j; ←j に変更   t = *min; *min = *i; *i = t;  } } 以上。

dasaitama7
質問者

お礼

早速なおしてみました …が、プログラムを実行しても、並び替えを行ってくれません 他にもバグがあるのでしょうか

関連するQ&A

専門家に質問してみよう