【问题标题】:Bubble Sort algorithm in Lua will not workLua 中的冒泡排序算法不起作用
【发布时间】:2021-03-06 13:04:12
【问题描述】:

我目前正在学习 Lua,我正在尝试用它创建一个冒泡排序算法。但是,我无法让它工作。谁能指出原因?

我可以指出的一些细节是,在较短的列表(例如 3 个元素长的列表)上,该算法确实成功地对其进行了排序,但随后继续对其进行排序,就好像它没有排序一样。在较长的列表(例如 5 个元素长的列表)上,程序根本不会对其进行排序。我通过让程序在每次交换两个元素时打印列表来获得这些信息。

user_input = 0
list = {}

while user_input ~= "SORT" do
  print("Input number value, or input SORT to start sort")
  user_input = io.read()
  if user_input ~= "SORT" then
    table.insert(list, user_input)
  end
end

done = false
while done == false do
  done = true
  for k, v in pairs(list) do
    if k ~= 1 then
      if list[k] < list[k - 1] then
        list[k], list[k - 1] = list[k - 1], list[k]
        done = false
        for k, v in pairs(list) do
          io.write(v .. " ")
        end
        print()
      end
    end
    if k == 1 then
      if list[k] < list[table.maxn(list)] then
        list[k], list[table.maxn(list)] = list[table.maxn(list)], list[k]
        done = false
        for k, v in pairs(list) do
          io.write(v .. " ")
        end
        print()
      end
    end
  end
end

io.write("RESULT: ")
for k, v in pairs(list) do
  io.write(v .. " ")
end
print()

【问题讨论】:

  • 你用的是什么版本的lua? table.maxn 不在 5.3 版本中
  • 我使用的是 5.1.5。

标签: lua bubble-sort


【解决方案1】:

这是我的实现,有几点说明:

我的 lua (luau) 版本支持类型检查等,因此您可能需要从参数中删除 : table。 (如果您想了解有关 luau 的更多信息 - 这是链接:https://roblox.github.io/luau/ - 真的很酷)

local function bubbleSort(t: table)
    local function check(i, v)
        local nextNum = t[i+1]
        if nextNum and (nextNum < v) then
            t[i] = nextNum
            t[i + 1] = v

            return true
        end
    end

    local changeMade
    repeat
        changeMade = false
        for i, v in next, t do
            changeMade = check(i, v) or changeMade
        end
    until changeMade == false
end

local tableForSorting = {2,5,4} --2,4,5
bubbleSort(tableForSorting)
print(tableForSorting)

希望这对您有所帮助,并展示了如何真正精简您的代码库,并且它仍然可以完全一样地工作!正如其他人所提到的那样,您的不工作的原因是pairs() 并没有始终以相同的方式对列表进行排序。

实际上,我们将pairs() 用于字典,而ipairs() 用于数组。你会注意到我在这个例子中使用了next,next 与ipairs() 完全相同。如果您有任何后续问题,请在下方提问:)!

【讨论】:

    【解决方案2】:

    在 Lua 中有 2 个函数用于为表 pairsipairs 创建迭代器

    pairs 产生的订单是不确定的,它会返回所有的键值对,但订单不能得到。

    • 您可以在 Lua 5.1 参考手册中的 next 下找到此内容
    • 例如:{1,2,3,4,5} 输出可能是5,2,4,1,3

    ipairs 的顺序是 1 到第一个 nil 它不会返回任何非整数键。

    • 示例:{1,2,3,nil,5} 将给您 1,2,3

    使用pairs,您的算法输出可能是正确的,但由于来自pairs 的排序,可能会出现错误

    您希望使用ipairs 评估算法的输出,以便按索引排序。


    您的算法不像现在那样执行冒泡排序,如果您愿意,我可以对此进行更正。对于这个最初的答案,我认为清除会产生不一致输出的原因应该为您指明正确的方向。

    冒泡排序应该一次“排序”1 个索引,第一遍将获得排序后数组的最后一个值。然后每次通过后排序以下位置。例如:

    • 第一次通过之前2,1,3,4,5,8,7,6
    • 第一次通过后1,2,3,4,5,7,6,8

    维基百科有很棒的页面,用于对带有 gif 图像的算法进行排序,这些页面可以真正帮助理解它的功能:Bubble Sort

    【讨论】:

      【解决方案3】:

      您正在使用pairs() 而不是ipairs() 再加上您的代码有一个不需要的额外 maxn() 例程。

      #! /usr/bin/env lua
      
      local user_input = 0
      local list = {}
      
      while user_input ~= 'sort' do
          print( 'Input number value, or input SORT to start sort' )
          user_input = io.read() :lower()
          --  the word 'sort' doesn't return a number, thus no final insertion
          table.insert( list, tonumber( user_input ) )
      end
      
      local found_swap = true
      while found_swap do
          found_swap = false
          for i = 2, #list do
              if list[i] < list[i -1] then
                  list[i], list[i -1] = list[i -1], list[i]
                  found_swap = true
              end
          end
      end
      
      io.write( 'RESULT: ' )
      for i, v in ipairs( list ) do
          io.write( v ..' ' )
      end
      print()
      

      【讨论】:

        猜你喜欢
        • 2014-12-30
        • 2021-02-16
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        相关资源
        最近更新 更多