2010-05-31 59 views
0

我發現自己面臨着一個面試問題,其目的是寫一個排序算法進行排序無序int值的數組:while(condition){// work}`和`do {// work} while(condition)`有什麼好處?

int[] unsortedArray = { 9, 6, 3, 1, 5, 8, 4, 2, 7, 0 }; 

現在我用Google搜索,並發現有這麼多的sorting algorithms有! 最後,我可以激勵自己挖掘Bubble Sort,因爲它看起來很簡單。

我讀了示例代碼,並來到了一個解決方案看起來像這樣:

static int[] BubbleSort(ref int[] array) 
    { 
     long lastItemLocation = array.Length - 1; 
     int temp; 
     bool swapped; 

     do 
     { 
      swapped = false; 
      for (int itemLocationCounter = 0; itemLocationCounter < lastItemLocation; itemLocationCounter++) 
      { 
       if (array[itemLocationCounter] > array[itemLocationCounter + 1]) 
       { 
        temp = array[itemLocationCounter]; 
        array[itemLocationCounter] = array[itemLocationCounter + 1]; 
        array[itemLocationCounter + 1] = temp; 

        swapped = true; 
       } 
      } 

     } while (swapped); 

     return array; 
    } 

清楚看出,這是一種情況:do { //work } while(cond)語句是一個很大的幫助是,防止使用另一個輔助變量。

但是,這是唯一的情況下,這是更有用的,或者你知道任何其他應用程序,這種情況已被使用?

+0

相關http://stackoverflow.com/questions/1035229/when-is-a-do-while-appropriate/1035234#1035234 – 2010-05-31 18:19:24

回答

11

一般:

  • 使用do...while當你想將至少執行一次身體。
  • 使用while...當你可能不希望身體被執行。

編輯:我會說第一個選項出現約10%的時間和第二個約90%。在任何情況下,您都可以重新使用。使用最接近你想說的那個。

+0

這就是爲什麼我使用其中一種。 – Will 2010-05-31 18:25:44

5

do ... while保證循環內部的代碼體至少執行一次在某些情況下,這可能很方便;例如,編碼REPL循環時。

+1

REPL循環?您是指Read-Eval-Print-Loop? – 2010-05-31 18:21:20

+0

@Shaharyar:如果你正在編寫一個REPL循環,不使用它。這只是一個非常簡單的例子。 – 2010-05-31 18:31:23

+0

@RobertHarvey - 他的意思是模擬:「REPL循環」==「讀取Eval打印循環循環」 – tekknolagi 2011-10-15 22:24:33

1

任何時候你通過一些代碼,直到一個條件滿足需要循環是何時使用......做一個很好的例子,同時或在...

的時候用做一個很好的例子...同時或同時......如果您有遊戲或模擬遊戲引擎持續運行各種組件,直到出現某種情況,比如贏或輸時。

當然這只是一個例子。

+0

你提供了一個例子,但是你沒有說明哪個'while'模式適合你的例子。 – 2010-05-31 18:40:46

+0

@Robert基於「什麼時候做,什麼時候做,什麼時候做」的問題,使我相信OP想要什麼時候使用的例子,而不是解釋什麼時候使用一個。至於我關於遊戲的例子,我已經看到了在這種特殊情況下的使用。因此,我沒有指定一個。 – 2010-05-31 22:37:15

0

上述帖子對於兩個條件循環表單是正確的。有些語言重複,直到形式,而不是做。還有一種極簡主義觀點,即只有必要的控制結構應該存在於一種語言中。雖然這樣做是必要的,但是這樣做並非如此。至於冒泡排序,你會想避免去那裏,因爲它是最慢的常用排序算法。改爲選擇排序或插入排序。快速排序和合並排序速度很快,但如果您碰巧選擇了較差的樞軸值,則很難在不使用遞歸的情況下編寫並且執行得很糟糕。