例題7.2 演習 b

  #include <stdio.h>

  #define SIZE 100

  main( )
  {
    int data[SIZE];
    int n;
    int i, j;
    int max, m;

  /* データの読み込みと確認の出力 */
    n = 0;
    while (scanf("%d", &data[n])  !=  EOF) n++;
    n--;                            /* - が二つ */

    for (i=0; i<=n; i++) printf("%d\n", data[i]);
    putchar('\n');

  /* data[0] 〜 data[n] にデータが格納されている */


  /* 並べ替え */
    for (i=0; i<n; i++) {           /* 変数 i と j を区別すること! */

      m = i; max = data[m];        /* data[i] 〜 data[n] の最大値を見つける */
      for (j=i+1; j<=n; j++) {       /*  最大値は max = data[m]        */
        if (data[ j ] > max) {
          max = data[ j ]; m = j
        }
      }
                            /* 見つけた最大値と data[i] を交換する */
      data[m] = data[ i ]; data[ i ] = max;   ***
    }


  /* 結果の出力 */
    for (i=0; i<=n; i++) printf("%d\n",data[i]);
    putchar('\n');
  }


補足
*** で示した行について
  考え方で示したものと違うがなぜか?

  二つの文は,実行しなくても良い場合がある。
  必要がない場合は,実行しないように変更しなさい。



並べ替えの部分を関数としたもの

  #include <stdio.h>

  #define SIZE 100

  void sort(int size, int array[ ])
  {
    int i, j, m, max;

    for (i=0; i<size; i++) {
      m = i;  max = array[m];
      for (j=i+1  j<=size; j++)
        if (array[j]>max) {
          m = j;  max = array[m];
        }

      if (m!=i) {
        array[m] = array[i];  array[i] = max;
      }
    }
  }


  main()
  {
    void sort(int, int[ ]);
    int data[SIZE];
    int n;
    int i;

    n=0;
    while (scanf("%d", &data[n]) != EOF) n++;
    n--;

    for (i=0; i<=n; i++) printf("%d\n", data[i]);
    putchar('\n');

    sort(n, data);

    for (i=0; i<=n; i++) printf("%d\n", data[i]);
  }