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