Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Java_Algorithm_Sorting_Mergesort - Fatal编程技术网

合并排序算法-java

合并排序算法-java,java,algorithm,sorting,mergesort,Java,Algorithm,Sorting,Mergesort,我对Java中的MergeSort实现有一个问题。我的代码是这样的,我不知道哪里出错了 public List sort(List list) { return mergesort(list, 0, list.size() - 1); } private List mergesort(List list, int startIndex, int endIndex) { if (startIndex == endIndex) {

我对Java中的MergeSort实现有一个问题。我的代码是这样的,我不知道哪里出错了

public List sort(List list) {
        return mergesort(list, 0, list.size() - 1);
    }

    private List mergesort(List list, int startIndex, int endIndex) {
        if (startIndex == endIndex) {
            List temp = new ArrayList();
            temp.add(list.get(0));
            return temp;
        }
        int splitIndex = ((startIndex + endIndex) / 2);
        List list1 = mergesort(list, startIndex, splitIndex);
        List list2 = mergesort(list, (splitIndex + 1), endIndex);
        return merge(list1, list2);
    }

    private List merge(List left, List right) {
        List result = new ArrayList();
        ListIterator l = new ListIterator(left);
        ListIterator r = new ListIterator(right);
        l.first();
        r.first();
        while (!l.isDone() && !r.isDone()) {
            if (comparator.compare(l.current(), r.current()) <= 0) {
                result.add(l.current());
                l.next();
            } else {
                result.add(r.current());
                r.next();
            }
        }
        while (!l.isDone()) {
            result.add(l.current());
            l.next();
        }
        while (!r.isDone()) {
            result.add(r.current());
            r.next();
        }
        return result;

    }
输出如下所示:

0. Adam, Malysz, 40
1. Adam, Malysz, 40
2. Adam, Malysz, 40
3. Adam, Malysz, 40
4. Adam, Malysz, 40
5. Adam, Malysz, 40

这个街区看起来不对劲

if (startIndex == endIndex) {
    List temp = new ArrayList();
    temp.add(list.get(0));
    return temp;
}

也许,您的意思是
temp.add(list.get(startIndex))

似乎合并函数总是使用相同的最小元素,直到列表为空。这给我的印象是,“ListIterator::current()”和“ListIterator::next()”的使用存在问题

我对列表迭代器不是很精通,所以我的建议是直接对列表进行操作。这还简化了在两个列表中的一个元素用完后添加其余元素的过程:

private List merge(List left, List right) {
    List result = new LinkedList();

    while (!left.isEmpty() && !right.isEmpty()) {
        if (comparator.compare(left.get(0), right.get(0)) <= 0) {
            result.add(left.remove(0));
        } else {
            result.add(right.remove(0));
        }
    }

    // add what is left in the lists
    result.addAll(left);
    result.addAll(right);

    return result;
}
私有列表合并(左列表、右列表){
列表结果=新建LinkedList();
而(!left.isEmpty()&&!right.isEmpty()){
if(comparator.compare(left.get(0),right.get(0))
private List merge(List left, List right) {
    List result = new LinkedList();

    while (!left.isEmpty() && !right.isEmpty()) {
        if (comparator.compare(left.get(0), right.get(0)) <= 0) {
            result.add(left.remove(0));
        } else {
            result.add(right.remove(0));
        }
    }

    // add what is left in the lists
    result.addAll(left);
    result.addAll(right);

    return result;
}