Кто-нибудь знает, как исправить эту Merge Sort? - PullRequest
0 голосов
/ 26 ноября 2010

http://pt.wikipedia.org/wiki/Merge_sort#Java Этот код не компилируется.

Спасибо.

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

Ошибка объема при использовании posicao в вызове System.arraycopy.Объявление этой переменной в начале метода mesclar (а не внутри цикла for внизу) приведет к его компиляции, но это не обязательно будет означать, что логика хороша.Кроме того, вложенные операторы if внутри цикла for не могут использоваться для такого назначения.Вложенные троичные операторы сделают свое дело, но удачи, если кто-то еще поймет это.Вместо этого присваивание vetor[inicio + posicao] должно дублироваться внутри каждого блока if.

1 голос
/ 26 ноября 2010

Вот рабочая реализация из 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;  
    }  
}
0 голосов
/ 26 ноября 2010

Вы должны обернуть это внутри определения класса и вызвать его в основном методе. Затем он скомпилируется и запустится.

...