2013-03-05 3 views
1

Я выполняю алгоритм гребня как назначение класса, и он петли всякий раз, когда я запускаю его. Я не уверен, что я сделал неправильно (я получил его работу на C++, но это было давно, и эти навыки не переводятся так же хорошо, как я бы хотел). Я пробовал это уже полтора часа, и по электронной почте некоторые друзья, но, к сожалению, у нас нет идей. Я думаю, мне нужен только кто-то, у кого есть больше опыта, чтобы рассказать мне, что я испортил. Благодаря!Сортировка гребня Java в бесконечном цикле

import java.util.ArrayList; 

public class CombSort { 
    public CombSort() 
    { 
     super(); 
    } 

    public ArrayList<Integer> combSort(ArrayList<Integer> sortMe) 
    { 
     int swap; 
     int size = sortMe.size(); 
     int gap = size; 
     boolean swapped = false; 

     while ((gap > 1) || swapped) 
     { 
      if (gap > 1) 
      { 
       gap = (int) ((size)*((double)gap/1.247330950103979)); 
      } 

      swapped = false; 

      for (int i = 0; gap + i < size; ++i) 
      { 
       if (sortMe.get(i) - sortMe.get(i + gap) > 0) 
       { 
        swap = sortMe.get(i); 
        sortMe.set(i, sortMe.get(i + gap)); 
        sortMe.set(i + gap, swap); 
        swapped = true; 
       } 
      } 
     } 
     return sortMe; 
    } 

    public static void main(String[] args) 
    { 
     ArrayList<Integer> randomArrayList = new ArrayList<Integer>(7); 
     randomArrayList.add(5); 
     randomArrayList.add(7); 
     randomArrayList.add(2); 
     randomArrayList.add(6); 
     randomArrayList.add(8); 
     randomArrayList.add(2); 
     randomArrayList.add(9); 
     CombSort combSorter = new CombSort(); 
     System.out.println(combSorter.combSort(randomArrayList).toString()); 
    } 
} 
+0

Я предлагаю вам начать отладку свой собственный код, чтобы помочь изолировать причину проблемы. Вы можете сделать это с помощью отладчика IDE, если вы используете один или путем разбрызгивания инструкций System.out.println() во всем коде. –

ответ

4

Ваше значение gap становится все больше с каждой итерации внутри цикла while, следовательно, почему она бесконечно обхвата.

Вы должны умножать зазор на коэффициент гребня, а не на размер.

(int) ((size)*((double)gap/1.247330950103979)); должен быть

(int) ((double)gap/1.247330950103979);

+0

Huzzah! Большое спасибо, я сомневаюсь, что поймал бы это, если бы не потратил час или больше работы. Также прокричайте Code-Guru, потому что я определенно должен был это сделать, прежде чем отправлять вопрос. – Pop67

+0

Без проблем, рад, что это помогло! – zz3599