有谁知道如何修复此合并排序?

时间:2010-11-26 13:26:44

标签: java mergesort

http://pt.wikipedia.org/wiki/Merge_sort#Java 该代码无法编译。

谢谢。

3 个答案:

答案 0 :(得分:1)

posicao的调用中使用System.arraycopy时出现范围错误。在mesclar方法的开头声明该变量(而不是在底部的for循环内部)将使其编译,但这并不一定意味着逻辑良好。此外,for循环中的嵌套if语句不能用于这样的赋值。嵌套的三元运算符可以解决问题,但是如果有其他人理解它,那就太好了。相反,vetor[inicio + posicao]的分配应该在每个if块内重复。

答案 1 :(得分:1)

这是http://rosettacode.org/wiki/Merge_sort#Java的一个有效实现,链接到英文维基百科关于合并排序的文章。

import java.util.LinkedList;  
public class Merge<E extends Comparable<? super E>> {  
    public LinkedList<E> mergeSort(LinkedList<E> m){  
        if(m.size() <= 1) return m;  

        int middle= m.size() / 2;  
        LinkedList<E> left= new LinkedList<E>();  
        for(int i= 0;i < middle;i++) left.add(m.get(i));  
        LinkedList<E> right= new LinkedList<E>();  
        for(int i= middle;i < m.size();i++) right.add(m.get(i));  

        right= mergeSort(right);  
        left= mergeSort(left);  
        LinkedList<E> result= merge(left, right);  

        return result;  
    }  

    public LinkedList<E> merge(LinkedList<E> left, LinkedList<E> right){  
        LinkedList<E> result= new LinkedList<E>();  

        while(!left.isEmpty() && !right.isEmpty()){  
            //change the direction of this comparison to change the direction of the sort  
            if(left.peek().compareTo(right.peek()) <= 0) result.add(left.remove());  
            else result.add(right.remove());  
        }  

        result.addAll(left);  
        result.addAll(right);  
        return result;  
    }  
}

答案 2 :(得分:0)

您必须将其包装在类定义中并在main方法中调用它。然后它将编译并运行。