2010-05-31 13 views
0

je me suis retrouvé confronté à une question d'entrevue où le but était d'écrire un algorithme de tri qui trie un tableau de int non triées valeurs:Quels sont les avantages de `while (condition) {// work}` et `do {// work} while (condition)`?

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

Maintenant, je googlé et a découvert qu'il ya tant de sorting algorithms là-bas! Enfin, je pouvais me motiver à creuser dans Bubble Sort parce que cela semblait assez simple pour commencer.

J'ai lu le code d'échantillon et est venu à une solution qui ressemble à ceci:

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; 
    } 

Je clairement voir que cela est une situation dans laquelle la déclaration do { //work } while(cond) est une grande aide pour être et empêche la utilisation d'une autre variable auxiliaire.

Mais est-ce le seul cas que cela soit plus utile ou connaissez-vous une autre application où cette condition a été utilisée?

+0

En relation http://stackoverflow.com/questions/1035229/when-is-a-do-while-appropriate/1035234#1035234 –

Répondre

11

En général:

  • utilisation do...while lorsque vous voulez que le corps à exécuter au moins une fois.
  • utilisez while... si vous ne souhaitez pas que le corps soit exécuté.

EDIT: Je dirais que la première option arrive environ 10% du temps et la seconde environ 90%. Vous pouvez toujours modifier le facteur d'utilisation dans les deux cas. Utilisez celui qui est le plus proche de ce que vous voulez dire.

+0

C'est pourquoi j'utilise l'un ou l'autre. – Will

5

do ... while garantit que le corps de code à l'intérieur de la boucle s'exécute au moins une fois. Cela peut être utile sous certaines conditions; lors du codage d'une boucle REPL, par exemple.

+1

REPL Loop? Parlez-vous de Read-Eval-Print-Loop? –

+0

@Shaharyar: Si vous codez une boucle REPL, n'utilisez pas celle-ci. C'est juste un exemple très simple. –

+0

@RobertHarvey - il veut se moquer de: "REPL Loop" == "Lire la boucle Loop Loop" – tekknolagi

1

Chaque fois que vous devez faire une boucle par un code jusqu'à ce qu'une condition soit remplie est un bon exemple quand utiliser ... tout faire ou tout ...

Un bon exemple de quand utiliser faire ... while ou while ... est si vous avez un jeu ou une simulation où le moteur de jeu exécute en continu les différents composants jusqu'à ce que certaines conditions se présentent comme si vous gagniez ou perdiez.

Bien sûr, ce n'est qu'un exemple.

+0

Vous avez fourni un exemple, mais vous n'avez pas indiqué quel modèle 'while' est approprié pour votre exemple. –

+0

@Robert basé sur la question «quand est-ce que faire et pendant que faire» m'a fait croire que l'OP voulait des exemples de quand utiliser et non pas une explication de quand utiliser l'un sur l'autre. En ce qui concerne mon exemple concernant les jeux, j'ai vu les deux utilisés dans cette situation particulière. Donc, je n'en ai pas spécifié un. –

0

Les messages ci-dessus sont corrects concernant les deux formes de bouclage conditionnel. Certaines langues ont une répétition jusqu'à la forme au lieu de faire tout le temps. Il existe également une vision minimaliste selon laquelle seules les structures de contrôle nécessaires doivent exister dans une langue. Le while est nécessaire mais le do ne l'est pas. Et en ce qui concerne le tri des bulles, vous voudrez éviter d'y aller car c'est le plus lent des algorithmes de tri les plus connus. Regardez plutôt le tri par sélection ou le tri par insertion. Le tri rapide et le tri par fusion sont rapides mais sont difficiles à écrire sans utiliser la récursivité et ne fonctionnent pas correctement si vous choisissez une mauvaise valeur de pivot.