2015-02-23 36 views
0

我的shell排序算法有問題。它是50個數字的矢量,並希望按遞增順序排序。它起作用很好,但當差距= 1時,它只是迭代一次然後停止。我認爲它與while(inner < getElementCount()- gap){條件有關,因爲我希望它迭代,直到向量排序。在過去的幾個小時裏我一直在努力,真的需要som的幫助!Shell排序算法沒有完成

public void shellSort() { 
    int inner = 0; 
    int outer = 0; 
    float gap = getElementCount()/(float)2.2; 

    while(inner < getElementCount()- gap) { 
     for(inner = 0; inner < getElementCount() - gap; inner++) { 
      outer = inner + (int)gap; 
      if(cmp(outer,inner)< 0) { 
       swap(outer,inner); 
      } 
      else { 
       while(cmp(outer,inner) > 0) { 
        outer--; 
       } 
       if(gap!=1 && inner < outer) { 
        swap(outer,inner); 
       } 
      } 
     } 
     if(gap <= 2.2) { 
      gap = 1; 
     } 
     else { 
      gap = gap/(float)2.2; 
     } 
    } 
} 
+0

如何才能「而」條件返回false,如果內環永遠不會增加「內部」超越「getElementCount() - 差距」? – 2015-02-23 16:57:25

+0

錯誤是這個'shell'與標籤'shell'有關嗎? – luk32 2015-02-23 17:03:12

+0

顯然不是。編輯。 – Filip 2015-02-23 17:12:40

回答

0

問題是與while(inner < getElementCount()- gap){

是的,你是正確的,將進行第一循環工作過,但是當它進入for循環。你增加內部變量,一旦它不滿足inner < getElementCount() - gap,它會從for循環中斷開,然後檢查while循環以進一步循環,並看到它不會因爲while循環而出現inner < getElementCount() - gap

我建議你喜歡的東西for循環替換而:

for (int i=0; i<getElementCount()/2; i++) 
+0

這很有效,但問題在於它的「欺騙」解決方案。即使排序完成,算法也會繼續比較數組。我們希望algortihm跳出循環第二個排序完成 – Filip 2015-02-23 17:09:01

+0

如果是這種情況,然後檢查互換,如果沒有更多的交換髮生,那麼你可能會做排序(但可能不完全證明) 。 – SMA 2015-02-23 17:12:23