2017-07-31 17 views
-2

私は整数のリストを調べて、最小の数字を選び、それをより大きなものと交換する選択ソートをしようとしています。リストの最初の番号。このコードはちょうど4つの整数の短い文字列で練習しています。私が苦労しているのは、移動する前に最小の数字を見つけるために整数の全リストを調べることです。私はこれが独自のネストされたforループとしてうまくいくことを見出しましたが、整数をスワップしようとしたときに最も小さい数字を指していたインデックスを「覚えていません」(コメントアウトされたコード行です。 'j'が何であるかは分からない)。 forループ内でこれを実行しようとすると、他の小さな整数があるかどうかを確認する前に、交換している最初の整数よりも早い最初の整数を早期に交換します。正しい方向のヒントがあれば幸いです。ありがとうございました!C(選択ソート)のforループの外側でforループインデックスを使用する方法

int main (void) 
{ 

    int tmp; 
    int n = 4; 
    int values[] = {5,3,4,1}; 



    for (int i=0; i < n; i++) 
    {  
     int minimum = values[i]; 

     for (int j=1; j < n; j++) 
     { 
      if (values[j]<minimum) 
      { 
       minimum=values[j]; 
      } 

     } 

     tmp = values[i]; 
     values[i] = minimum; 
     //values[j] = tmp;  

    } 
}  
+0

'minimum_j = j'のような別の変数で' j'を覚えることができます。ここで 'int_min_j'は関数スコープで定義されています。または「私」か何でも。 –

+0

'int最小=値[i];' - > 'int min_i = i;' [this](http://ideone.com/jXJvs4) – BLUEPIXY

答えて

0

あなたは最小値のインデックスである変数minimumIndexを追加する必要があります。 minimumの値を更新すると、jに設定され、ループの最後に最小値のインデックスが与えられます。正しい値で初期化することもできます。mimimumvalues[i]に初期化されているため、minimumIndexiに初期化する必要があります。

j=1で内側ループを開始しますが、既に配置されている要素をスキップするように、開始位置はiまたはi+1である必要があります。

+0

ありがとう、これは理にかなっています。 – Josh

+0

minimumIndexをiに初期化する方法と理由を明確にしてもらえますか?最初に変数を宣言すると、それをiと同じに設定しますか?私がこれをしないと、最小値が設定されている場合、更新されたインデックスによって初期化された値が上書きされませんか? – Josh

+0

@Josh 'minimum'を' values [i] 'に初期化します。これが実際に最小値であれば 'if'条件は決して真ではないので、' minimumIndex'を 'i'にします。 – interjay

0

要素のインデックスを最小値に保つだけです。たとえば、

#include <stdio.h> 

int main (void) 
{ 
    int values[] = { 5, 3, 4, 1 }; 
    size_t n = sizeof(values)/sizeof(*values); 

    for (size_t i = 0; i < n; i++) 
    { 
     printf("%d ", values[i]); 
    } 

    putchar('\n'); 

    for (size_t i = 0; i < n; i++) 
    {  
     size_t minimum = i; 

     for (size_t j = i + 1; j < n; j++) 
     { 
      if (values[j] < values[minimum]) 
      { 
       minimum = j; 
      } 
     } 

     if (minimum != i) 
     { 
      int tmp = values[i]; 
      values[i] = values[minimum]; 
      values[minimum] = tmp;  
     } 
    } 

    for (size_t i = 0; i < n; i++) 
    { 
     printf("%d ", values[i]); 
    } 

    putchar('\n'); 
} 

内側ループのインデックスは、値i + 1で始まるように注意してください。

for (size_t j = i + 1; j < n; j++) 
       ^^^^^ 
+0

本当にありがとうございました。本当にありがとうございます。 – Josh

+0

なぜデータ型size_tを作成するのか尋ねることができますか?私は以前これを見たことがありませんでしたが、intデータ型を使うだけで十分でしょうか? – Josh

+0

@Josh size_tは、通常unsigned long型のエイリアスとして定義される整数型です。この型は、演算子sizeofと、ヘッダーで宣言された文字列関数、たとえば関数strlenによって使用されます。問題は、配列が非常に大きくて型intがそのような配列のすべてのインデックスを格納できないことです。 –

関連する問題