2017-05-29 118 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