如何修复Java中的合并排序算法并从函数返回排序数组

如何修复Java中的合并排序算法并从函数返回排序数组,java,sorting,mergesort,Java,Sorting,Mergesort,我在Java中实现合并排序算法时遇到了一个问题:我已经完成了合并排序算法,但它不能产生正确的结果。我还从函数返回排序列表。我怎样才能做到呢 下面是我定义的合并排序算法 合并排序方法: public static void mergeSort(ArrayList<Person> personList, Comparator<Person> compTr) { ArrayList<Person> helper = new ArrayList<Pers

我在Java中实现合并排序算法时遇到了一个问题:我已经完成了合并排序算法,但它不能产生正确的结果。我还从函数返回排序列表。我怎样才能做到呢

下面是我定义的合并排序算法

合并排序方法:

public static void mergeSort(ArrayList<Person> personList, Comparator<Person> compTr) {
    ArrayList<Person> helper = new ArrayList<Person>();
    mergeSort(personList, helper, 0, personList.size() - 1, compTr);
}
publicstaticvoidmergesort(arraylistpersonlist,comparatorcomptr){
ArrayList助手=新建ArrayList();
mergeSort(personList,helper,0,personList.size()-1,compTr);
}
合并排序功能:

private static void mergeSort(ArrayList<Person> list, 
                              ArrayList<Person> helper, 
                              int low, 
                              int high, 
                              Comparator<Person> compTr) {
    if (low < high) {
        int middle = (low + high) / 2;
        mergeSort(list, helper, low, middle, compTr); //sort left half
        mergeSort(list, helper, middle + 1, high, compTr); //sort right half
        merge(list, helper, low, middle, high, compTr); // merge
    }
}
私有静态无效合并排序(ArrayList列表,
ArrayList助手,
int低,
int高,
比较器(compTr){
如果(低<高){
int-middle=(低+高)/2;
mergeSort(list,helper,low,middle,compTr);//对左半部分进行排序
mergeSort(list,helper,middle+1,high,compTr);//对右半部分进行排序
合并(列表,辅助对象,低,中,高,compTr);//合并
}
}
合并算法:

private static void merge(ArrayList<Person> list, 
                          ArrayList<Person> helper, 
                          int low, 
                          int middle, 
                          int high,
                          Comparator<Person> compTr) {
    //This loop throws Exception
    for (int i = low; i < high + 1; i++) {
        helper.add(i, list.get(i));
    }

    int helperLeft = low;
    int helperRight = middle + 1;
    int current = low;

    while (helperLeft < middle && helperRight < high) {
        if (isGreaterThan(helper.get(helperLeft), helper.get(helperRight), compTr)) {
            list.set(current, helper.get(helperLeft));
            helperLeft++;
        } else {
            list.set(current, helper.get(helperRight));
            helperRight++;
        }
        current++;
    }

    //Copy remaining elements
    int remaining = middle - helperLeft;
    for (int j = 0; j <= remaining; j++) {
        list.set(current + j, helper.get(helperLeft + j));
    }

    // RETURN LIST(list) _-> TO DO 
}
私有静态无效合并(ArrayList列表,
ArrayList助手,
int低,
int中间,
int高,
比较器(compTr){
//此循环引发异常
对于(int i=低;i<高+1;i++){
add(i,list.get(i));
}
int helperLeft=低;
int helperRight=中间+1;
int电流=低;
while(helperLeft
实现比较器特性

public static boolean isGreaterThan(Person helperLeft, Person helperRight, Comparator<Person> compTr) {
    return greaterThan(compTr, helperLeft, helperRight);
}

private static boolean greaterThan(Comparator comp, Person x, Person y) {
    return comp.compare(x, y) > 0;
}
公共静态布尔值大于(Person helperLeft、Person helperRight、Comparator compTr){
返回值大于(compTr、helperLeft、helperRight);
}
私有静态布尔值大于(比较器comp,Person x,Person y){
返回组件比较(x,y)>0;
}
我该怎么做

我无法从合并函数中获取作为列表的返回值

如果我理解正确,您正在寻找返回已排序列表的方法。但在您的实现中,您正在尝试对原始列表进行排序。
这意味着您在调用merge函数时已经有了一个指向结果排序列表的变量:调用merge函数时用作参数的变量

public static void mergeSort(ArrayList<Person> personList, Comparator<Person> compTr)
publicstaticvoidmergesort(arraylistpersonlist,comparatorcomptr)
例如,如果您的人员位于名为“列表”的ArrayList中,则您正在对该“列表”进行排序

ArrayList list=new ArrayList();
对于(int i=0;i<10;i++){
list.add(newperson());
}
系统输出打印项次(列表);
mergeSort(list,Comparator.naturalOrder());
系统输出打印项次(列表);
关于更多信息,您使用的是一个inout参数——例如,您将输入输入给函数,并通过该参数接收其输出


正如注释中指出的,代码还有其他问题。我怀疑这里有一个错误(这是我的答案

我改了密码

 while(helperLeft < middle && helperRight < high) {
while(helperLeft

while(helperLeft无需返回已排序的数组:数组已排序到位

但请注意这些问题:

    >P>辅助数组应该分配一个初始大小等于要排序的数组的大小。这避免了<代码>帮助器的问题。添加(i,List.GET(i));保持“强”>插入“< /强”>辅助数组中间的额外元素。这是非常低效的:它要求<强> O(n*log(n))。额外的空间,而不仅仅是O(n)并且具有O(nnlog(n))的时间复杂度,这比插入排序更糟糕

    您将使用

      ArrayList<Person> helper = new ArrayList<Person>(personList);
    
包含上界的惯例令人困惑且容易出错,排除上界要简单得多,因为它消除了
-1
/
+1
调整的需要

以下是修改后的版本:

publicstaticvoidmergesort(arraylistpersonlist,comparatorcomptr){
ArrayList助手=新的ArrayList(personList);
mergeSort(personList,helper,0,personList.size(),compTr);
}
私有静态void合并排序(ArrayList列表,
ArrayList助手,
int低,
int高,
比较器(compTr){
如果(高-低>=2){
int middle=低+(高-低)/2;
mergeSort(list,helper,low,middle,compTr);//对左半部分进行排序
mergeSort(list,helper,middle,high,compTr);//对右半部分进行排序
合并(列表,辅助对象,低,中,高,compTr);//合并
}
}
私有静态无效合并(ArrayList,
ArrayList助手,
int低,
int中间,
int高,
比较器(compTr){
对于(int i=低;i<高;i++){
set(i,list.get(i));
}
int helperLeft=低;
int helperRight=中间;
int电流=低;
while(helperLeft while(helperLeft < middle && helperRight < high) {
 while(helperLeft <= middle && helperRight <= high) {
  ArrayList<Person> helper = new ArrayList<Person>(personList);
  while (helperLeft <= middle && helperRight <= high)