• 締切済み

C言語での配列順序を変えたい

C言語で遺伝的アルゴリズムを作ろうと思っています。そのときに「配列の中の値を調べてそれを数字の高い順に別の配列に入れる」というので、並び替える方法がわかりません。 for(i=0;i<10;i++){ //並び替える前をy、並び替えた後をzとする for(j=0;j<10;j++){ if(y[i] < y[j]){ z[i+1] = y[i]; }else{ z[i-1] = y[i]; } } } としてやってみたら、よく考えると上の配列に値があった場合、重なってしまうので、実際表示して見たところ同じような数字が出てきました。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

#5 です。 #3さん>・下手に考えるより、y→zへそのままコピーして z をソートするのが確実 は承知していました。なるほどと。 その意味では、 #4さん>結論としては「ソートについて調べましょう」ですね。 言葉足らずでしたが、一発(コピー + ソート)で決めるには・・と。 その発想自体が無駄でしたね。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

そんな面倒なことをせずとも, あらかじめ y の内容を全部 z にコピーしとけばいいのでは>#5.

すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

「配列 y を変更してはいけない」ものを作ってみました。 参考までに。 #4さん>結論としては「ソートについて調べましょう」ですね。 「配列 y を変更してはいけない」の場合は、「ソートについて調べ」ただけでは、ダメかもしれません。 3重の for 構文になりそう・・。 「ソート」と同じ、2重でできそうなもんですが、年寄りの夜更かしには思いつかない・・残念。 #include <stdio.h> #define CNT 10 int main( void ) {  double y[ CNT ] = { 0.9, 1.8,-2.7, 3.6, 4.5, 5.4, 6.3,-7.2, 8.1, 9.0 };  double z[ CNT ], dMax;  int iSumi[ CNT ] = { 0 };  int i, j, nn, kk;  for( nn = 0; nn < CNT; nn++ ){   for( j = 0; j < CNT; j++ ){    if( iSumi[ j ] ) continue;    dMax = y[ j ]; // 仮の最大値    kk = j;    for( i = 0; i < CNT; i++ ){     if( iSumi[ i ] ) continue;     if( dMax < y[ i ] ){      dMax = y[ i ];      kk = i;     }    }   }   z[ nn ] = y[ kk ];   iSumi[ kk ] = 1;  }  for( i = 0; i < CNT; i++ ) printf( " %5.1f", y[ i ] );  printf( "\n" );  for( i = 0; i < CNT; i++ ) printf( " %5.1f", z[ i ] );  printf( "\n" );  return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

すると、全ての回答が全文表示されます。
  • LOHA
  • ベストアンサー率52% (203/388)
回答No.4

#3さんへ。 仰るとおりです。 投稿後に#1さんのソートするだけというの見て、あーアホしたと思いましたが(yからzへ入れるということを考えすぎてたようで…)、まぁそれでもひとつの方法としてこんなのもあるという事で、ご容赦を。 結論としては「ソートについて調べましょう」ですね。

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

・単純挿入ソートの要領で、一つ一つ並べながらzへ追加する ・下手に考えるより、y→zへそのままコピーして z をソートするのが確実 #2さんへ。 そのやりかただと、配列yの内容が破壊されてしまいますし、yがintでなければ使えないし、計算時間も無駄です。 「配列yを変更していい」のなら、そんな面倒なことしないで、最初から配列yをソートすればいいです。

すると、全ての回答が全文表示されます。
  • LOHA
  • ベストアンサー率52% (203/388)
回答No.2

こんなんでどうでしょう。 /* 最大の要素番号を返す */ int maxIndex(int* a, int size) {   int i, mi = 0;   for (i = 1; i < size; ++i)     if (a[mi] < a[i])       mi = i;   return mi; } /* ループ部 */ for (i = 0; i < 10; ++i) {   int mi = maxIndex(y, 10);   z[i] = y[mi];   y[mi] = INT_MIN; } #動作確認はしていません。ミスがあったらスミマセン。 #型違ったら適宜変更してください。 #全角スペースにしてるので、コピペの際は注意。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

そこで悩むくらいならソートのアルゴリズムを調べた方がはるかに速い.

すると、全ての回答が全文表示されます。