2013-03-05 64 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

我建議你通過調試自己的代碼,以幫助找出問題的原因入手。如果您正在使用一個或者在您的代碼中使用System.out.println()語句,您可以使用IDE的調試器來執行此操作。 – 2013-03-05 02:46:41

回答

4

gap值越來越大,大家的while循環內每個迭代的,因此爲什麼它是無限循環。

你應該只乘以comb因子,而不是大小。

(int) ((size)*((double)gap/1.247330950103979));應該

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

+0

Huzzah!非常感謝,我懷疑如果沒有一小時或更多的工作,我會抓住這一點。同樣對Code-Guru大喊大叫,因爲在提交問題之前我肯定應該這樣做。 – Pop67 2013-03-05 03:00:48

+0

沒問題,很高興幫助! – zz3599 2013-03-05 03:09:18