2010-05-31 55 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

上述帖子对于两个条件循环表单是正确的。有些语言重复,直到形式,而不是做。还有一种极简主义观点,即只有必要的控制结构应该存在于一种语言中。虽然这样做是必要的,但是这样做并非如此。至于冒泡排序,你会想避免去那里,因为它是最慢的常用排序算法。改为选择排序或插入排序。快速排序和合并排序速度很快,但如果您碰巧选择了较差的枢轴值,则很难在不使用递归的情况下编写并且执行得很糟糕。