1

このコードがあります。

どちらもsystem.out.printlnステートメントを使用して配列要素を出力します。Arrays.toString(array)もともと、正常に機能するメイン メソッドで配列を表示するために return ステートメントを使用していました。ここで、複雑さのレベルを抑えるためだけに print ステートメントを使用することができます。ご覧のとおり、出力フォームの並べ替えに配列の最後の要素がありません。これは、 を使用しているためですarray.length -1。ただし、使用しない場合array.length -1は取得する.ArrayIndexOutOfBoundsExceptionので、これに対する実用的な解決策はありますか?

import java.util.Arrays;
public class SortMethod
{
    static int[] array = {2,1,5,3,5};


    public void sort(int[] arrays)
    {

        for(int i = 0;i < arrays.length - 1;i++ )
        {
            int store = 0;
            if (arrays[i + 1 ] < arrays[i])
            {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
        }

        System.out.println();
    }

    public void reverse (int[] arrays)
    {   
        for (int i=arrays.length-1; i >=0; i--)
        {
            System.out.print(arrays[i]);
        }


    }
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        SortMethod sort = new SortMethod();
        sort.sort(array);
        sort.reverse(array);

    }

}

出力;

From Sort:1235
From Reverse:55321
4

5 に答える 5

2

まず、ソート方法が実際には正しくソートされません。すぐ左の値で値をチェックしますが、リストの最後に 4 があるとどうなりますか?

{2,1,5,3,5,4}

結果を返します:

123545

これはほとんどソートされていません...切り替えるすべての値を取得し、逆方向にチェックして、前の値よりも小さくないことを確認する必要があります。現在、値を右に並べ替えますが、左に戻すことはありません。

また、並べ替えアルゴリズムを実行してから、並べ替えメソッドの途中で値を出力しようとするのではなく、配列を反復処理してから値を出力することもできます。

public class TestCode
{
static int[] array = {2,1,5,3,5,4,9,1,99,7};


public void sort(int[] arrays)
{

    for(int i = 0; i < arrays.length - 1 ;i++ )
    {
        int store = 0;
        // Move larger values to the right
        if (arrays[i] > arrays[i + 1])
        {
            store = arrays[i];
            arrays[i] = arrays[i + 1];
            arrays[i + 1] = store;
            // Sort swapped smaller values to the left
            for(int j = i; j > 1; j--)
            {
                if (arrays[j] < arrays[j - 1])
                {
                    store = arrays[j];
                    arrays[j] = arrays[j - 1];
                    arrays[j - 1] = store;
                }
            }

        }
    }

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

public void reverse (int[] arrays)
{   
    for (int i=arrays.length-1; i >=0; i--)
    {
        System.out.print(arrays[i] + " ");
    }


}
/**
 * @param args
 */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        TestCode sort = new TestCode();
        sort.sort(array);
        sort.reverse(array);

    }

}

次の出力が得られます。

1 1 2 3 4 5 5 7 9 99

99 9 7 5 5 4 3 2 1 1

まとめ:

配列をソートするときは、値を比較するために配列array.length - 1時間を反復する必要があります (最後の値をその右側の値と比較する必要はありません。

配列を印刷するときは、それをarray.length何度も繰り返して、すべての値を印刷する必要があります。array.length - 1あなたの主な問題は、おそらくソートアルゴリズムの外で配列を印刷する必要があるときに、配列時間を反復するだけのソートアルゴリズムで配列を印刷しようとすることから来ています。

于 2013-09-01T04:15:53.600 に答える
1

次のように並べ替え方法を変更します。

public void sort(int[] arrays) {
        // int i = 0;
        for (int i = 0; i < arrays.length - 1; i++) {
            int store = 0;
            if (arrays[i + 1] < arrays[i]) {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
            if (i + 1 == arrays.length - 1) {
                System.out.print(arrays[i + 1]);
            }
        }

        System.out.println();
    }

新しい印刷ステートメントを追加しました

if (i + 1 == arrays.length - 1) {
System.out.print(arrays[i + 1]);
}  

最後の配列要素を出力します。

于 2013-09-01T03:51:59.433 に答える
1

関数の最後の行public void sort(int[] arrays):

   System.out.println();

する必要があります

System.out.println(arrays[arrays.length - 1]);

穴配列を印刷したいので。

記録のために、このpublic void sort(int[] arrays)関数は実際には配列をソートしません。sort隣接する要素のチェックと交換を 1 回行うだけで、 が行うべきことではありません。

たとえば、 が次のようにarray初期化されている場合:

static int[] array = {2,1,5,3,5};

の結果の配列sortは:53215で、反転した配列は51235です。どちらも意図した結果ではありません。

于 2013-09-01T03:26:34.883 に答える
1

sort() では、0 からarrays.length-1 (排他的) まで反復しているため、arrays.length==5 変数の場合値は 0、1、2、3 になります。

reverse() ではarrays.length-1 ( inclusive ) から 0まで繰り返します- iは値: 4、3、2、1、0 を取ります。

sort()arrays.length-1から-1部分を削除すると、ArrayOutOfBoundsException が発生します。これは、i==4 の配列範囲になるarrays[i + 1]を参照するためです。

于 2013-09-01T03:27:15.057 に答える
1

まず、コードが不完全であることを指摘したいと思います。これはソート コードの半分にすぎません。バブル ソートを使用しようとしていることがわかりますが、残念ながら内側のループがありません。

これとは別に、このコードには問題はありません。

ソート方法を以下のものに置き換えていただけませんか?これにより、すべての問題が修正されます。

 public void sort(int[] a){
    int temp = 0;
    for(int i = 0 ; i < a.length ; i++){
      for(int j = 0 ; j< a.length - 1 ; j++){
        if(a[j] > a[j+1]){
          temp = a[j];
          a[j] = a[j+1];
          a[j+1]=temp;
        }

      }

    }
    printArray(a);
  System.out.println();
}


public void printArray(int[] a){
    for(int i = 0 ; i < a.length ; i++){
        System.out.print(a[i]);
    }
}

また、並べ替えのテクニックについてもお読みになることをお勧めします。いつでもアクセスできます記事の並べ替え

于 2013-09-01T04:38:26.023 に答える