2017-05-29 6 views
3

J'ai donc essayé d'implémenter bubblesort en utilisant les types de référence de ML. J'ai compilé le code dans Poly/ML et il semble que la boucle "while (! Flag)" ne s'exécute qu'une seule fois pour n'importe quelle entrée. Par exemple: [2,3,1] est "trié" à [2,1,3], c'est-à-dire que la première boucle a fonctionné mais que la seconde n'a jamais fonctionné.Pourquoi cette boucle ML standardort ne s'exécute-t-elle qu'une seule fois?

"Flag up" a été imprimé une fois.

Qu'est-ce qui ne va pas?

Merci.

fun bubbleSort l =  (* l being a list of references *) 
let 
    val it = ref 0  (* iterator variable *) 
    val len = length l 
    val flag = ref true (* to be set to true when a swap is made *) 
in 
    while (!flag) do 
    (
     flag := false; 
     while ((!it) < (len-1)) do 
     (
      if (get l (!it)) > (get l ((!it)+1)) 
      then (swap_next l (!it); flag := true; TextIO.print "Flag up\n") 
      else(); 
      it := (!it) + 1 
     ) 
    ) 
end; 

code complet du module je l'ai écrit, si nécessaire, se trouve here.

+3

Drive-by commentaire: 53,33% (mesuré avec précision) de vos parenthèses sont redondants. –

+0

Merci! Je savais que certains d'entre eux allaient être redondants mais je me prépare à la hâte pour un examen où la correction est beaucoup plus importante que le style donc je le laisse glisser :) –

Répondre

4

Bubblesort effectue des balayages répétés sur le même réseau. Votre boucle interne l'analyse juste une fois mais ne réinitialise jamais le compteur it. Avant la ligne

while ((!it) < (len-1)) do 

Vous devez mettre la ligne

it := 0; 
+1

Ou déplacez le 'let val it = ref 0' dans la boucle externe . – sepp2k