2010-11-26 2 views
-2

http://pt.wikipedia.org/wiki/Merge_sort#Java Этот код не скомпилирован.Кто-нибудь знает, как исправить эту сортировку слияния?

спасибо.

+0

«Не скомпилировать» является недостаточным описанием ошибки. Кроме того, английская Википедия имеет две ссылки на рабочие реализации Java (на самом деле, из OpenJDK). –

+4

В любом случае, я предлагаю вам использовать встроенный массив Arrays.sort(), если это не домашнее задание. ;) –

+0

какие пожалуйста? asnwer как ответ: D – Seva

ответ

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; 
    } 
} 
0

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

+0

нет, они не будут: P – Seva

1

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

+1

Это образец кода ... не воспринимайте это как полностью реализованный класс. –

+0

Я не воспринимал это как полностью реализованный класс. Он просто терпит неудачу в качестве образца кода. – gdejohn

Смежные вопросы