2017-05-29 4 views
3

Also habe ich versucht, bubblesort mit ML-Referenztypen zu implementieren. Ich habe den Code in Poly/ML kompiliert und es scheint, dass die "while (! Flag)" - Schleife nur einmal für jede Eingabe ausgeführt wird.Warum wird diese Schleife des Standard-ML-Bubblesorts nur einmal ausgeführt?

Zum Beispiel: [2,3,1] wird zu [2,1,3] "sortiert", d. H. Die erste Schleife funktionierte, aber die zweite lief nie.

"Flag up" wurde einmal gedruckt.

Was ist los?

Danke.

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; 

Voll Code des Moduls schrieb ich, wenn nötig, können here gefunden werden.

+3

Drive-by Kommentar: 53,33% (gemessen genau) Ihre Klammern redundant sind. –

+0

Danke! Ich war mir bewusst, dass einige von ihnen überflüssig sein würden, aber ich bereite mich hastig auf eine Prüfung vor, bei der Korrektheit wichtiger ist als Stil, also lasse ich sie gleiten :) –

Antwort

4

Bubblesort scannt wiederholt dasselbe Array. Ihre innere Schleife scannt nur einmal darüber, aber setzt den Zähler nie zurück it. Vor der Linie

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

sollten Sie die Zeile setzen

it := 0; 
+1

Oder verschiebe das "let val it = ref 0" in die äußere Schleife . – sepp2k

Verwandte Themen