2017-05-29 237 views
3

所以我試圖用ML的參考類型實現bubblesort。我編譯了Poly/ML中的代碼,似乎「while(!flag)」循環只對任何輸入執行一次。這個Standard ML bubblesort的循環爲什麼只執行一次?

例如:[2,3,1]被「排序」爲[2,1,3],即第一個循環工作但第二個循環未運行。

「標誌」打印一次。

怎麼了?

謝謝。

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; 

我寫的模塊的完整代碼,如果需要,可以找到here

+3

驅動式註釋:53.33%(精確測量)你括號是多餘的。 –

+0

謝謝!我知道他們中的一些人會是多餘的,但我正在準備考試,正確性比風格重要得多,所以我讓它滑動:) –

回答

4

Bubblesort重複掃描相同的數組。你的內循環只掃描一次,但不會重置計數器it。行

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

之前,您應該放線

it := 0; 
+1

或者將'let val it = ref 0'移動到外部循環。 – sepp2k