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
Java:ArrayList的合并排序不起作用_Java_Sorting_Mergesort - Fatal编程技术网

Java:ArrayList的合并排序不起作用

Java:ArrayList的合并排序不起作用,java,sorting,mergesort,Java,Sorting,Mergesort,它可以正确地比较对象,但使用重复的对象会使列表的大小加倍 public static void mergeSort(List<Person> list) { List<Person> helper = new ArrayList<Person>(list.size()); mergeSort(list, helper, 0, list.size()); } private static void mergeSo

它可以正确地比较对象,但使用重复的对象会使列表的大小加倍

public static void mergeSort(List<Person> list) {
        List<Person> helper = new ArrayList<Person>(list.size());
        mergeSort(list, helper, 0, list.size());
    }

    private static void mergeSort(List<Person> list, List<Person> helper, int low, int high) {
        if(low < high) {
            int middle = (low+high)/2;
            mergeSort(list, helper, low, middle); //sort left half
            mergeSort(list, helper, middle+1, high); //sort right half
            merge(list, helper, low, middle, high); // merge
        }
    }

    private static void merge(List<Person> list, List<Person> helper, int low, int middle, int high) {
        for(int i=low; i<= high; i++) {
            helper.add(i, list.get(i));
        }

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

        /**
         * Iterate through helper array, copying back smaller element in the original list 
         */
        while(helperLeft <= middle && helperRight <= high) {
            if(helper.get(helperLeft).isLessThan( helper.get(helperRight))) {
                list.add(current, helper.get(helperLeft));
                helperLeft++;
            } else {
                list.add(current, helper.get(helperRight));
                helperRight++;
            }
            current++;
        }

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

    }
公共静态无效合并排序(列表){
List helper=newarraylist(List.size());
mergeSort(list,helper,0,list.size());
}
私有静态void合并排序(列表列表、列表帮助器、整型低、整型高){
如果(低<高){
int-middle=(低+高)/2;
mergeSort(list,helper,low,middle);//对左半部分进行排序
mergeSort(list,helper,middle+1,high);//对右半部分进行排序
合并(列表、辅助对象、低、中、高);//合并
}
}
私有静态无效合并(列表列表、列表帮助器、低整型、中整型、高整型){

对于(inti=low;i有几个问题

不要使用
列表#添加
,使用
列表#设置

而不是

    while(helperLeft <= middle && helperRight <= high) {
        if(helper.get(helperLeft).isLessThan( helper.get(helperRight))) {
            list.add(current, helper.get(helperLeft));
            helperLeft++;
        } else {
            list.add(current, helper.get(helperRight));
            helperRight++;
        }
        current++;
    }

    //Copy remaining elements
    int remaining = middle - helperLeft;
    for(int j=0; j <= remaining; j++) {
        list.add(current+j, helper.get(helperLeft+j));
    }
    for (int i = low; i <= high; i++) {
        helper.add(i, list.get(i));
    }
    while (helperLeft <= middle && helperRight <= high) {
你应该使用

    for (int i = low; i < high; i++) {
        helper.add(i, list.get(i));
    }

当不使用<代码>列表时,添加< <代码> >尝试使用<代码>列表。设置< <代码>,在新的一个有趣的部分不使用<代码> >代码> > < <代码> >之前,应该考虑给予反馈,我认为<代码>添加< /代码>是正确的。离子

用于我。
用于(int i=低;i
    for (int i = low; i <= high; i++) {
        helper.add(i, list.get(i));
    }
    for (int i = low; i < high; i++) {
        helper.add(i, list.get(i));
    }
    while (helperLeft <= middle && helperRight <= high) {
    while (helperLeft < middle && helperRight < high) {
----Unsorted
1L; 10/01/1960
1L; 04/05/1978
1L; 09/17/1986
1L; 02/15/1971
1L; 07/01/1971

----Sorted
1L; 10/01/1960
1L; 02/15/1971
1L; 07/01/1971
1L; 04/05/1978
1L; 09/17/1986
 private static void mergeSort(List<Person> list, List<Person> helper, int low, int high) {
    if(high - low<2) {
        sortTheSmallList(list,low,high);
    }else{
        int middle = (low+high)/2;
        mergeSort(list, helper , low, middle); //sort left half
        mergeSort(list, helper, middle+1, high); //sort right half
        merge(list, helper, low, middle, high);
    }
}