2010-11-26 53 views
-2

http://pt.wikipedia.org/wiki/Merge_sort#Java 該代碼不能編譯。有誰知道如何解決這個合併排序?

謝謝。

+0

「不編譯」是不足的錯誤描述。此外,英文維基百科有兩個鏈接到工作的Java實現(事實上來自OpenJDK)。 – 2010-11-26 13:32:43

+4

無論如何,我建議你使用內建的Arrays.sort(),除非這是作業。 ;) – 2010-11-26 13:39:10

+0

哪些人請? aslwer as a answer:D – Seva 2010-11-26 13:41:05

回答

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

您必須將其包裝在類定義中並在主方法中調用它。然後它會編譯和運行。

1

在調用System.arraycopy時,使用posicao時存在範圍錯誤。在mesclar方法的開始處聲明該變量(而不是在底部的for循環內部)會使其編譯,但這並不一定意味着邏輯的好處。另外,for循環中嵌套的if語句不能用於像那樣的賦值。嵌套的三元運算符可以做到這一點,但祝其他人能夠理解它。相反,分配到vetor[inicio + posicao]應該在每個if塊中重複。

相關問題