bugfix> java > 投稿

intの配列を最小値から最大値に並べ替えます。次のアルゴリズムを作成しましたが、問題は、新しい配列がifステートメントから正しい値を受け取らないことです。以下にコードを配置します。

public static void main(String[] args) {
    int[] arr = {33,44,22,11,22,11};
    int[] arrSort = new int[6];
    int temp=0;
        for (int i = 0; i < arrSort.length - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                temp = arr[i + 1];
                arr[i + 1] = arr[i];
                arrSort[i] = temp;
            }
            else {
                arrSort[i] = arr[i];
            }
        }
    System.out.println(Arrays.toString(arrSort));
}

コードを実行すると、次の値が得られます:[33、22、11、22、22、11、0];

アルゴリズムのどの部分が間違っていると考えられたのかを知りたいだけです。前もって感謝します。

回答 5 件
  • 1つのループだけではできません。ソートはそれよりも複雑です。バブルソートまたは選択ソートでは、O(n ^ 2)のようになります。クイックソートやマージソートなど、より良い結果をもたらし、O(n log N)の複雑さを目的とする優れたアルゴリズムがあります。とにかく、たとえば単純なバブルソートの実装の場合は、そのようにすることができます。

    int[] arr = {33,44,22,11,22,11};
      for (int i = 0; i < arrSort.length - 1; i++) {
                        for(int j=i;j<arrSort.length; j++) {
                             if (arr[i] > arr[j]) {
                                    temp = arr[j];
                                    arr[j] = arr[i];
                                    arr[i]=temp;
                                }
                        }   
      System.out.println(Arrays.toString(arr));
    
    

  • You need to apply 2 loops.
    1st loop is to access 1st arr element.
    2nd loop is to access next(1st + 1)th element.
    After comparing 1st element with other swap it accordingly. 
    public static void main(String []args)
         {
            int[] arr = {33,44,22,11,22,11};
            int len=arr.length;
            int temp=0,i,j;
            for (i = 0; i < len; i++) 
            {
                for (j = i+1; j < len; j++)
                {
                    if (arr[i] > arr[j]) 
                    {
                        temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            for(i=0; i<arr.length; i++)
            {
                System.out.println(arr[i]);
            }
         }
    
    

  • これがあなたに役立つかどうかわからないが、Javaが仕事をすることができるなら、なぜあなた自身でそれを分類するか:

    int[] unsortedArray = { 33, 44, 22, 11, 22, 11 };
    ArrayList<Integer> intArray = new ArrayList<>();
    for( int value : unsortedArray )
    {
      intArray.add( value );
    }
    Collections.sort( intArray );
    System.out.println( intArray );
    
    

  • ヘルパー変数tempを使用して位置を移動する場合、2番目の配列は不要で、arr [i]に戻すだけです。次に、1回の実行では十分ではありません。位置の変更が不要になるまで、これを実行する必要があります。したがって、次のようになります。

    public static void main(String[] args) {
        //source Array
        int[] arr = {33,44,22,11,22,11};
        int temp=0;
        //marker, that positions were switched
        boolean sthChanged = false;
        do
        {
            //in each run assume that nothing is left to change
            sthChanged = false;
            for (int i = 0; i < arr.length - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    //we found an instance, where the earlier position holds a higher int than the latter
                    //save the latter value in the temp variable
                    temp = arr[i + 1];
                    //move the former value to the latter position
                    arr[i + 1] = arr[i];
                    //fill the former position with the value from the temp variable
                    arr[i] = temp;
                    //set the marker to true, as there might be other changes to be done
                    sthChanged = true;
                }
            }
        }
        while (sthChanged); //stop only, if we didn't find sth to be changed in the last run
        System.out.println(Arrays.toString(arr));
    }
    
    

    宜しくお願いします

  • まず、メモリの無駄と不要な配列アクセスのオーバーヘッドのため、アルゴリズムで2つの配列を使用しないでください。元の配列を保持する必要がある場合は、コピーして、コピーした配列をsortメソッドに送信します。

    次に、ここで採用されている方法(バブルソート)の場合、配列を反復処理し、最大の要素を見つけて最後に移動します。 Uは、length-1、length-2 ... 1のサブアレイごとにこのプロセスを繰り返す必要があります。 したがって、このアプローチの時間の複雑さはO(n ^ 2)になります。理論的なO(n log(n))時間でソートを実行できるMergeSort、QuickSortなどのより良いアルゴリズムがあります。

    コードに必要な以下の修正を参照してください。

    public static void main(String[] args) {
            int[] arr = {33,44,22,11,22,11};
            //int[] arrSort = new int[6];
            int temp=0;
            for(int j = 0; j < arr.length; j++) {
                for (int i = 0; i < arr.length - 1; i++) {
                    if (arr[i] > arr[i + 1]) {
                        temp = arr[i + 1];
                        arr[i + 1] = arr[i];
                        arr[i] = temp;
                    }
                }
            }
            System.out.println(Arrays.toString(arr));
        }
    
    

あなたの答え