2017-08-29 18 views
0

私の目標は、ar []配列の要素をソートされた[]配列に移動し、それらを最小から最大まで並べ替えることです。私のループは配列の中で最小の要素を見つけて要素を大きな数に置き換えることになっているので、私はその部分で問題を抱えています。私はコードの大半を持っていると思うが、プログラムを実行すると、ソートされた[]配列のすべての要素は2です。私はここで何が間違っていますか?ある配列から別の配列にソートする

public class Lab1 
{ 
    public static void main(String argv[]) 
    { 
     int ar[]  = { 7, 5, 2, 8, 4, 9, 6 }; 
     int sorted[] = new int[ar.length]; 
     int smallest = ar[0]; 
     int smallestindex = 0; 

     for (int i=0; i<ar.length; i++) 
     { 
      for (int n=0; n<ar.length; n++) 
      { 
       if (ar[n] < smallest) 
       { 
        smallest = ar[n]; 
        smallestindex = n; 
       } 
      } 

      sorted[i] = smallest; 
      ar[i] = 1000000; 
     } 

     // print sorted array: 
     for (int i=0; i<sorted.length; i++) 
     { 
      System.out.println("sorted[" + i + "] = " + sorted[i]); 
     } 
    } 
} 
+1

並べ替える前にアレイのコピーを作成するだけです。 – crook

+0

内部ループに 'i'への参照がないことに注目してください。なぜその結果は指数によって変わるでしょうか? – shmosel

+0

これは悪いコード 'ar [i] = 1000000;'さらに、なぜソートされた要素を別の配列に配置したいのですか?オリジナルを保持したい場合は、オリジナルのコピーを作成し、現在の配列で作業してください。 – user3437460

答えて

0

私は今、私のPCを持っていないが、私はこの問題は、あなたが2で最小の変数最初の時間を設定したら、それは永遠に2のままとなし、他の小さい数があることだと思います。だから私はあなたが内部の一度だけ実行していると思うと値は常に2です。

編集。私は、拳の下で最も小さな初期化を動かすべきだと思います。

0

この条件が満たされていない場合は、何もしませんでした。

if (ar[n] < smallest) 

このように、最小の要素はこのチェックに合格し、新しい配列に移動します。

また、あなたがこの

List<Integer> ar = Arrays.as list (*your numbers here*); 

Collections.sort(ar):

0

のようにより良い形であなたの配列をソートすることができますあなたが「セレクションのソート」と呼ばれるアルゴリズムを使用してソートしたいようだが、あなたのコードが悪い実装であります。

あなたはこの兄弟の質問から学び、その下の答えを確認することができますされている、[]ソートに[] arの中で最小のコピー Selection Sort Example

0

おっと、あなたのループ内の問題があり、 2、 です。ソートされた[]内のすべての要素が2になります。

for (int i=0; i<ar.length; i++) 
    { 
     for (int n=0; n<ar.length; n++) 
     { 
      if (ar[n] < smallest) 
      { 
       smallest = ar[n]; <----YOU ALWAYS GET 2 HERE 
       smallestindex = n; 
      } 
     } 

     sorted[i] = smallest; <---- AND SET 2 TO YOUR sorted[] HERE 
     ar[i] = 1000000; 
    } 

あなたが解決したいか、それを自分で解決する場合は、あなたの質問が間違って何を求めているので、私は知らないが、ここではそれが簡単にソートされたコピーを作成するために、ところで

for (int i=0; i<ar.length; i++) 
    { 
     for (int n=0; n<ar.length; n++) 
     { 
      if (ar[n] < smallest) 
      { 
       smallest = ar[n]; 
       smallestindex = n; 
       ar[n] = 1000000; <----CHANGE THE SMALLEST ITEM HERE RATHER THAN OUTSIDE 
      } 
     } 

     sorted[i] = smallest;    
    } 

です方法:ソートそれはJavaの使用率を使用して、その後

int[] sorted = ar.clone(); 

Firsyコピーを作成

Arrays.sort(sorted); 

あなたが望むものを2行だけ得ることができます。

0

このようなことはどうですか?

ショートと甘い:

import java.util.Arrays; 

public class Lab1 
{ 
    public static void main(String argv[]) 
    { 
     int ar[]  = { 7, 5, 2, 8, 4, 9, 6 }; 
     int sorted[] = ar.clone(); 
     Arrays.sort(sorted); 

     System.out.println("Original array: " + Arrays.toString(ar)); 
     System.out.println("Sorted array: " + Arrays.toString(sorted)); 
    } 
} 

出力:

Original array: [7, 5, 2, 8, 4, 9, 6] 
Sorted array: [2, 4, 5, 6, 7, 8, 9] 
0

私は、なぜ我々は、別の配列に並べ替えのように、これを必要とします、理解することはできません。あなたはは、Arrays.sort()メソッドを使用してアレイ内で並べ替えることができます、またはあなたが別の配列でソートする場合は、次の手順を取ることができます:

  1. は、新しい配列に配列をコピーします。

  2. 新しい配列をソートして並べ替えます。

あなたの実装をそのまま使いたい場合は、コードをリファクタリングしました。あなたのコードは正常に動作し、次のようになります:

public class Prog1 { 
    public static void main(String[] args) { 
     int ar[] = { 7, 5, 2, 8, 4, 9, 6 }; 
     int sorted[] = new int[ar.length]; 
     int smallest = ar[0]; 
     int smallestindex = 0; 

     for (int i = 0; i < ar.length; i++) { 
      for (int n = 0; n < ar.length; n++) { 
       if (ar[n] < smallest) { 
        smallest = ar[n]; 
        smallestindex = n; 
       } 
      } 

      sorted[i] = smallest; 
      //Your mistake was here. 
      ar[smallestindex] = 1000000; 
      smallest=ar[0]; 
      smallestindex=0; 
     } 

     // print sorted array: 
     for (int i = 0; i < sorted.length; i++) { 
      System.out.println("sorted[" + i + "] = " + sorted[i]); 
     } 
    } 

} 

あなたの間違いは、「最小の」変数を再割り当てしていないことでした。配列の最小要素を指していたので、配列の要素がこの変数より小さいため、次の実行では更新されません。あなたがそれを得ることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

0

古い値(大きな値)を破棄してシフトするために保存しないたびに、
最小= ar [n]; smallestindex = n;セル間の値を変更するには、別の変数を追加するか、簡単な方法でarraylistを使用する必要があります。

int ar[] = {7, 5, 2, 8, 4, 9, 6}; 
    int sorted[] = new int[ar.length]; 
    int smallest = ar[0]; 
    for (int i = 0; i < ar.length ; i++) { 

     for (int j = i + 1; j < ar.length; j++) { 

      if (ar[i] > ar[j]) { 

       smallest = ar[j]; //save small value 
       ar[j] = ar[i];//transaction between two comparables cells 
       ar[i] = smallest;//set small value as first 

      } 
      sorted[i]=ar[i]; //set first small value 
     } 

    } 

    // print sorted array: 
    for (int i = 0; i < sorted.length; i++) { 
     System.out.println("sorted[" + i + "] = " + sorted[i]); 
    } 
関連する問題