2010-11-26 21 views
-2

http://pt.wikipedia.org/wiki/Merge_sort#Java そのコードはコンパイルされません。誰もこのマージソートを修正する方法を知っていますか?

ありがとうございます。

+0

"コンパイルできません"はエラーの説明が不十分です。さらに、英語のWikipediaには、実際にはOpenJDKのJava実装の2つのリンクがあります。 –

+4

いずれにしても、宿題でない限り、組み込みのArrays.sort()を使用することをお勧めします。 ;) –

+0

どちらかお気楽ですか? asnwer Answer:D – Seva

答えて

1

マージソートに関する英語のWikipediaの記事にリンクされている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

これをクラス定義の中にラップし、mainメソッドで呼び出す必要があります。その後、コンパイルと実行の両方を行います。

+0

いいえ、それらはありません:P – Seva

1

System.arraycopyへの電話でposicaoを使用しているスコープエラーがあります。その変数をmesclarメソッドの始めに(底部のforループの内部ではなく)宣言するとコンパイルされますが、必ずしもロジックの良さを意味するとは限りません。また、forループ内のネストされたifステートメントは、そのような割り当てに使用することはできません。ネストされた三項演算子はこのトリックを行いますが、他の誰かがそれを理解することを幸運にします。代わりに、vetor[inicio + posicao]への割り当ては、ブロックのifブロック内に複製する必要があります。

+1

これはコードサンプルです....これは完全に実装されたクラスとしてはとらないでください。 –

+0

私は完全に実装されたクラスとしてそれを取っていませんでした。コードサンプルとしては失敗します。 – gdejohn

関連する問題