2016-12-03 5 views
-1

現在、Cで配列ソートをしようとしています。しかし、それは動作しません、そして、私は本当に理由を理解していないので、私はあなたに助けを求めています。Cでの昇順による配列ソート

for(j=0;j<taille;j++){ 
    for(i=j; i<taille -1;i++){ 

     imin = j; 
     nbmin = tableau[j]; 

     if (tableau[i+1]<nbmin){ 

      imin = i+1; // on stocke l'indice de la plus petite variable 
      nbmin = tableau[i+1]; // on stocke la plus petite variable dans une variable intermédiaire 
     } 
     tableau[imin] = tableau[j]; // prend la dernière case non triée pour la mettre à l'endroit de la plus petite case du tableau 
     tableau[j] = nbmin; // la dernière case non triée contient la plus petite valeur non triée -> la cse est donc triée 

    } 
} 

ありがとうございました!

+3

フランス語を誰もが理解しているわけではありません。 –

+1

特定の変数がリセットされないようにする(imin、nbminが各jについてリセットされるように) –

+0

コードは正常に見えますが、出力はどのようになっていますか?ここでコピーできますか? –

答えて

0

外側ループの各繰り返しで、サブアレイ[j ... taille]の最小要素を決定し、それを前面にコピーする必要があります。あなたが使用するアルゴリズムは単純である:

  • は最小
  • スワップに最小

との最初の要素の内側を見つけるために、残りの要素で

  • ルック最初の要素を最小を初期化iのループがリストの2番目の項目ですが、実装では、ループ内で初期化とスワップが行われます。

    あなたのコードは次のようになります。

    for(j = 0; j < taille; j++) { 
        int imin = j;       // initialise minimum 
        int nbmin = tableau[j]; 
    
        for(i = j + 1; i < taille; i++) {  // find minimum 
         if (tableau[i] < nbmin) { 
          imin = i; 
          nbmin = tableau[i]; 
         } 
        } 
    
        tableau[imin] = tableau[j];    // swap elements 
        tableau[j] = nbmin; 
    } 
    

    (あなたの代わりに私がより自然見つけ要素tableau[i + 1]、の要素tableau[i]を見るように、私はまた、内側のインデックスを変更したそして、私はしました。

  • +0

    さて、私のコードは最終的に動いていて、私はそれを変更しなかったので、助けてくれてありがとうございました。しかし、私はポスト前よりも迷っています: ') –

    +0

    あなたのコードはうまくいきますが、 。おそらく実行したい選択ソートは、上記のように機能します。外側の反復につき最大で1つのスワップを行います。あなたは最小限の値を格納するために 'tableau [j]'を効果的に使い、内側の繰り返しのたびに 'j'の位置に最小値を残します。それぞれの内部反復で 'imin'をリセットし、それを上書きしてからスワップすることができます。これは、if条件の中で入れ替えることと多かれ少なかれ同じです。 (コードが同じであってもコードが入れ替わるので、私はほとんど言っています) –

    +0

    コードが動作しない変種は、スワップ/代入が内部ループの外側で起こるものです。この場合、インデックスは内側の各ループでリセットされるため、間違っている可能性があります。あなたのアルゴリズムが何をしているのか理解したいなら、例えば4つのアイテムの小さな配列を作成し、各繰り返しの後にそれを印刷します。もちろん、デバッガを使用することもできます。 –

    0

    選択ソート(wiki page)を使用したいと思います。

    アイデアは、各パスで最小アイテムを見つけて適切な場所に配置することです。

    これはあなたにアイデアを提供するためのコードスニペットです。変数宣言およびswapルーチンはスキップされます。

    for (i = 0; i < n - 1; i++) 
    { 
        min_index = i; 
        for (j = i + 1; j < n; j++) 
         if (array[j] < array[min_index]) 
          min_index = j; 
    
        if (min_index != i) 
         swap(array[i], array[min_index]); 
    } 
    
    関連する問題