2014-10-10 3 views
0

Для домашней работы CS, я пытаюсь использовать метод сортировки слияния для сортировки ArrayList. Вот мой код:Рекурсивный mergesort возвращает только первую половину ArrayList

public static LinkedList<Object> merge (LinkedList<Object> lsta, LinkedList<Object> lstb) { 
    LinkedList<Object> result = new LinkedList<Object>(); 
    LinkedList<Object> lstaNew = (LinkedList<Object>) lsta.clone(); 
    LinkedList<Object> lstbNew = (LinkedList<Object>) lstb.clone(); 
    while(lstaNew.size()>0||lstaNew.size()>0) { 
     if(lstaNew.size()>0&&lstbNew.size()>0) { 
      if(((Comparable) lstaNew.getFirst()).compareTo(lstbNew.getFirst()) < 0) { 
       result.add(lstaNew.getFirst()); 
       lstaNew.remove(); 
      } 
      else { 
       result.add(lstbNew.getFirst()); 
       lstbNew.remove(); 
      } 
     } 
     else if(lstaNew.size()>0) { 
      result.add(lstaNew.getFirst()); 
      lstaNew.remove(); 
     } 
     else { 
      result.add(lstbNew.getFirst()); 
      lstbNew.remove(); 
     } 
    } 
    return result; 
} 

public static LinkedList<Object> sort (LinkedList<Object> lst) { 
    if (lst.size() <= 1) return lst; 
    LinkedList<Object> left = new LinkedList<Object>(); 
    LinkedList<Object> right = new LinkedList<Object>(); 
    int midpoint = lst.size()/2; 
    for (int i=0;i<midpoint;i++) left.add(lst.get(i)); 
    for (int i=midpoint;i<lst.size();i++) right.add(lst.get(i)); 
    return merge(sort(left),sort(right)); 
} 

Однако в моих результатах я получаю только первую половину списка. Я просмотрел другие примеры сортировки слияния в Интернете, и мой код кажется похожим. Что я делаю не так? Было бы очень полезно оценить указатель в правильном направлении.

ответ

1

У вас есть опечатка в коде -

while(lstaNew.size()>0||lstaNew.size()>0) { 

должны были -

while(lstaNew.size()>0||lstbNew.size()>0) { 
Смежные вопросы