- 締切済み
ポインターを使った並べ替え
ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #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"); } } 以上が私の作成したプログラムです よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★やっぱ 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; } } ごめんなさい。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 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)
バグの指摘は先にされたので別のところを。 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
お礼
ご指摘ありがとうございます 検討してみます! (ソート名も含め…;;;)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★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; } } 以上。
お礼
早速なおしてみました …が、プログラムを実行しても、並び替えを行ってくれません 他にもバグがあるのでしょうか
お礼
何度もお返事いただいて、本当にありがとうございます! すごくありがたい限りです ですが、やはり並べ替えを行うプログラムにはなってくれません #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"); } } 現在はこのようになっているのですが、何かお気づきの点がありましたら教えてください><