Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Void合并排序方法java_Java_Sorting_Merge_Mergesort - Fatal编程技术网

Void合并排序方法java

Void合并排序方法java,java,sorting,merge,mergesort,Java,Sorting,Merge,Mergesort,所以,我的计算机科学老师告诉我,除了copyPartArray之外,这里的所有方法都是无效的。我不知道如何做到这一点,当我尝试时,这种方法根本就失败了 public static ArrayList<String> mergeSortHelper(ArrayList<String> a) { int mid = a.size() / 2 - 1; if (a.size() <= 1) return a; return merg

所以,我的计算机科学老师告诉我,除了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;
我已尝试将我的合并排序更改为:

    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));
}
把合并者一起除掉

现在我有:

    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);
我该如何将我的合并方法合并到此中?

copyPartArray将制作数组的副本,这样做不好,您的讲师希望您通过引用传递数组,然后还传递开始/结束或开始/长度整数。尝试这样做:

public static void mergeSort(ArrayList<String> a, int start, int length) {
    // refer to 'the array' as a[start] to a[start + length]
}
a将通过引用传递,这意味着您不需要返回值

因此,我将更改您的方法,以获得一个开始和长度,并一起摆脱copyPartArray,您可以在一个数组上进行合并


我在中使用了这个方法。

你的老师正在扼杀不变性的精神:好了,现在我有了“publicstaticvoidmergesortarraylista,int start,int end”{int mid=start+end/2;如果a.size很好,您将合并数组中始终相邻的两个部分。因此,您希望合并从开始到结束执行就地排序。类似于:mergeSorta,start,mid;mergeSorta,mid+1,end;mergea,start,end;