54585


C言語で、ランダムで発生させた数字をselect_sortを使って、小さい順に並べたいです。しかしterminalで以下のコマンドを使用しても、ところどころ小さい順に並びませんでした：

[code]

    $ gcc sort2.c -o sort2.s
    $ time ./sort2.s
    data size = 200
        8   11   12   18   22   15   24   32   38   40
       16   42   47   68   73   73   75   85   88   97
      100  101  106  112  113  124  143  149  154  156
      157  160  162  165  166  168  169  169  169  176
      180  207  208  209  214  225  231  228  249  256
      256  257  259  269  282  284  306  306  307  312
      319  321  325  327  329  331  346  352  354  358
      359  371  373  376  380  386  386  395  396  399
      404  413  419  423  423  426  430  433  438  443
      446  446  447  471  478  486  491  493  502  505
      510  515  518  523  523  525  526  528  529  533
      543  544  548  551  556  558  573  580  598  603
      605  609  609  615  627  642  643  646  650  652
      655  661  671  682  688  690  692  712  713  715
      720  725  725  738  739  751  754  755  758  758
      763  768  768  788  790  803  811  816  820  826
      826  832  833  843  851  853  858  858  865  871
      884  886  889  890  892  892  895  904  905  908
      911  911  914  915  915  921  925  927  936  941
      949  952  952  958  957  960  982  983  985  991
    
    real    0m0.008s
    user    0m0.003s
    sys 0m0.002s
    
[/code]

どこがおかしいのか指摘していただけないでしょうか。

[code]

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #define MAX 200
    #define RandMax 1000
    
    void select_sort(int a[], int n){ /*ランダムで発生した数字を小さい順に並べ替える*/
        int *i;
        int *j;
        int *min;
        int t;
        int *last;
    
        last=a+MAX;
    
        for (i=a; i<last; i++){
            min = i;
            for(j=i+1; j<last; j++){
                if (*j < *min){
                    min=j;
                }
            t=*min;
            *min = *i;   
            *i=t;        
            }
    
        }
    }
    int main(){
        int a[MAX];
        int i;
    
        srand((unsigned)time(NULL));
        for(i = 0; i < MAX; i++){
            a[i] = rand()%RandMax;
        }
    
        //for  (i=0; i<10000; i++){
        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");
        }
    }
    
[/code]


CC BY-SA 4.0
2019-04-29T23:44:54.550
54584
2019-04-30T04:01:55.143
2019-04-30T04:01:55.143
3060
34091
question
c
実行結果がうまく小さい順にならない


あなたが[別質問](https://ja.stackoverflow.com/q/54509/13972)に掲載していた`select_sort`(遅いにしても正しく動いていた)をインデントしたり、`{}`を補って整形するとこうなります。

[code]

    void select_sort(int a[], int n){ /*ランダムで発生した数字を小さい順に並べ替える*/
        int i, j, min, t;
        for( i = 0; i < n; ++i ) {
            min = i;
            for( j = i + 1; j < n; ++j ) {
                if( a[j] < a[min] ) {
                    min = j;
                }
            }
            t = a[min];
            a[min] = a[i];
            a[i] = t;
        }
    }
    
[/code]

補助変数`t`を使って、`a[min]`と`a[i]`を交換する部分は、`for( j.. ) {...}`のループ内ではなく、そのループの外(`for(
i... ) {...}`の中ではある)にあります。

あなたのこのご質問内のコードではそうなっていません。元の処理と同じになるよう書き換えてみてください。

[code]

    void select_sort(int a[], int n){ /*ランダムで発生した数字を小さい順に並べ替える*/
        int *i;
        int *j;
        int *min;
        int t;
        int *last;
    
        last=a+MAX;
    
        for (i=a; i<last; i++){
            min = i;
            for(j=i+1; j<last; j++){
                if (*j < *min){
                    min=j;
                }
            }
            t=*min;
            *min = *i;   
            *i=t;        
        }
    }
    
[/code]

常日頃から正しいインデントを心がけていないとこんな間違いに気付きにくくなります。

[code]

            for(j=i+1; j<last; j++){
                if (*j < *min){
                    min=j;
                }
            t=*min; //<- 突然前の行とインデントがずれている
            *min = *i;   
            *i=t;        
    
[/code]

別質問のコメントで「`for`や`if`は必ず`{}`と一緒に使う」「適切なインデントを心がける」と書いたことの重要性はご理解いただけたでしょうか。一度は理解して自分で書いたコードに機械的な書き換えを行う場合でも、それらが出来ていないと、こう言った間違いの元になります。

間違いが起こりにくいようなコーディングスタイルを身に付けていってください。


CC BY-SA 4.0
2019-04-30T00:13:12.507
54585
2019-04-30T00:13:12.507
13972
54584
answer