【问题标题】:Why does this Standard ML bubblesort's loop only execute once?为什么这个标准 ML 冒泡排序的循环只执行一次?
【发布时间】:2017-10-30 01:46:29
【问题描述】:

所以我尝试使用 ML 的引用类型来实现 bubblesort。我在 Poly/ML 中编译了代码,似乎“while(!flag)”循环只对任何输入执行一次。

例如:[2,3,1] 被“排序”为 [2,1,3],即第一个循环有效,但第二个循环从未运行。

“Flag up”被打印了一次。

怎么了?

谢谢。

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

【问题讨论】:

  • 路过评论:53.33%(精确测量)的括号是多余的。
  • 谢谢!我知道其中一些会是多余的,但我正在匆忙准备考试,因为正确性比风格更重要,所以我让它滑了:)

标签: while-loop reference sml bubble-sort ml


【解决方案1】:

冒泡排序重复扫描同一个数组。您的内部循环只扫描一次,但从不重置计数器it。行前

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

你应该放线

it := 0;

【讨论】:

  • 或者将let val it = ref 0移到外循环中。
猜你喜欢
  • 2015-10-18
  • 2022-01-05
  • 2013-11-06
  • 1970-01-01
  • 2012-08-28
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多