1

(コマンドライン引数からの)入力セットの数字をソートしたいのですが、コードのエラーを見つけることなく3日間ここで立ち往生しています...本当に必死です...

誰かヒントをくれませんか?

import java.util.Arrays;

public class MergeSorter 
{

    public MergeSorter(int[] anArray)
    {
        a = anArray;
    }
    public void sort()
    {
          if (a.length <= 1) return;
          int[] first = new int[a.length / 2];
          int[] second = new int[a.length - first.length];

          System.arraycopy(a, 0, first, 0, first.length);
          System.arraycopy(a, first.length, second, 0, second.length);

          MergeSorter firstSorter = new MergeSorter(first);
          MergeSorter secondSorter = new MergeSorter(second);
          firstSorter.sort();
          secondSorter.sort();
          merge(first, second);
    }
    private void merge(int[] first, int[] second)
    {
        int iFirst = 0;
        int iSecond = 0;
        int j = 0;
        while (iFirst < first.length && iSecond < second.length) 
        {
            if (first[iFirst] < second[iSecond])
            {
                a[j] = first[iFirst];
                iFirst++;
            }
            else
            {
                a[j] = second[iSecond];
                iSecond++;
            }
            j++;
        }
          System.arraycopy(first, iFirst, a, j, first.length - iFirst);
          System.arraycopy(second, iSecond, a, j, second.length - iSecond);
       }
    private int[] a;

    public static void main(String[] args)
    {
        int[] a = new int[args.length];
        for (int i = 0; i < args.length; i++) 
        {
            a[i] = Integer.parseInt(args[i]);
        }
        MergeSorter sorter = new MergeSorter(a);
        sorter.sort();
        System.out.println(Arrays.toString(a));
    }
}
4

3 に答える 3

1

正常に動作します。書いてみてください:

java MergeSorter 7 3 5 3 5

それは与えます:

[3,3,5,5,7]

しかし、次のように書くと:

java MergeSorter 73535

int引数が1つあるため、入力と同じになります。

[73535]
于 2012-04-15T10:15:35.313 に答える
1

テストコードの実行:

Random r = new Random();

int testCase = 0;
out: while (true) {
    System.out.println("Test case " + testCase++);

    //Create array of random length (from 0 to 999) and random content
    int[] a = new int[r.nextInt(1000)];
    for (int i = 0; i < a.length; i++)
        a[i] = r.nextInt();

    //Try to sort (in ascending order)
    MergeSorter sorter = new MergeSorter(a);
    sorter.sort();

    //Test if sorted
    for (int i = 0; i < a.length-1; i++) {
        if (a[i+1] < a[i]) //not ascending
        {
            System.out.println("Array is not sorted!");
            System.out.println(Arrays.toString(a));
            break out;
        }
    }
}

ソーターがソートしないケースは見つかりません (約 1.000.000 テスト ケースまで実行しました)。

于 2012-04-15T10:10:03.590 に答える
1

これが Mergesort の演習でない場合Arrays.sort(array);は、mergesort である を簡単に使用できます。

降順で並べ替えるには、独自のコンパレータを指定できます。

Arrays.sort(array, new Comparator<Integer>()
{
    public int compare(Integer i1, Integer i2)
    {
        return -i1.compareTo(i2);
    }
});
于 2012-04-15T10:04:41.430 に答える