1

そのため、コンピュータ サイエンスの先生から、copyPartArray を除くすべてのメソッドを無効にするように言われました。これを行う方法がわかりません。試してみると、並べ替えは単に失敗します。

public static ArrayList<String> mergeSortHelper(ArrayList<String> a) {
    int mid = a.size() / 2 - 1;
    if (a.size() <= 1)
        return a;
    return merge(mergeSortHelper(copyPartArray(a, 0, mid)),
            mergeSortHelper(copyPartArray(a, mid + 1, a.size() - 1)));
}

public static void mergeSort(ArrayList<String> a) {
    ArrayList<String> x = mergeSortHelper(a);
    for (int i = 0; i < a.size(); i++) {
        a.set(i, x.get(i));
    }
}   
    public static ArrayList<String> merge(ArrayList<String> a,
        ArrayList<String> b) {
    ArrayList<String> x = new ArrayList<String>(a.size() + b.size());
    int aCount = 0;
    int bCount = 0;
    for (int i = 0; i < a.size() + b.size(); i++) {
        if (aCount > a.size() - 1) {
            for (int j = bCount; j < b.size(); j++) {
                x.add(b.get(j));
            }
            break;
        }
        if (bCount > b.size() - 1) {
            for (int j = aCount; j < a.size(); j++) {
                x.add(a.get(j));
            }
            break;
        }
        if ((a.get(aCount)).compareTo(b.get(bCount)) < 0) {
            x.add(a.get(aCount));
            aCount++;
        } else {
            x.add(b.get(bCount));
            bCount++;
        }
    }
    return x;
}

    public static ArrayList<String> copyPartArray(ArrayList<String> a, int s,
        int e) {
    ArrayList<String> x = new ArrayList<String>();
    for (int i = s; i <= e; i++) {
        x.add(a.get(i));
    }
    return x;

mergeSort を次のように変更しようとしました。

    public static void mergeSort(ArrayList<String> a) {
    int mid = a.size() / 2 - 1;
    if (a.size() <= 1)
        return;
    mergeSort(copyPartArray(a, 0, mid));
    mergeSort(copyPartArray(a, mid + 1, a.size() - 1));
    merge(a, copyPartArray(a, 0, mid),
            copyPartArray(a, mid + 1, a.size() - 1));
}

mergeSortHelper をまとめて削除します。

今私が持っています:

    public static void mergeSort(ArrayList<String> a, int start, int end) {
    int mid = (start + end) / 2;
    if (a.size() <= 1)
        return;
    mergeSort(a, start, mid);
    mergeSort(a, mid + 1, end);

これに私のマージメソッドをどのように組み込むのですか?

4

1 に答える 1

0

copyPartArray配列のコピーを作成するので、それは良くありません。講師は、配列を参照渡ししてから、開始/終了 (または開始/長さ) の整数も渡すことを望んでいます。次のようにしてみてください。

public static void mergeSort(ArrayList<String> a, int start, int length) {
    // refer to 'the array' as a[start] to a[start + length]
}

aつまり、戻り値は必要ありません。

したがって、メソッドを変更してstartandlengthを取得し、copyPartArrayすべてをまとめて削除すると、1 つの配列でその場でマージを行うことができます。

この方法は、Quicksort に関するブログ投稿で使用しています。

于 2013-03-04T03:20:08.710 に答える