Lua 中的冒泡排序算法无法工作
2020-11-23 19:6:46
收藏:0
阅读:142
评论:3
我目前正在学习 Lua,并试图使用它创建一个冒泡排序算法。但我无法让它正常工作。有没有人能够指出为什么?
我可以指出一些细节,比如在像列表这样的较短列表上,算法确实可以成功地对其进行排序,但然后继续对其进行排序,好像它没有被排序一样。在像列出 5 个元素这样的更长的列表上,程序根本不会对其进行排序。我通过让程序每次交换两个元素时打印列表来获取这些信息。
user_input = 0
list = {}
while user_input ~= "SORT" do
print("输入数字值,或输入 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()
点赞
用户3342050
你正在使用pairs()而不是ipairs()。此外,你的代码有一个不必要的maxn()例程。
#! /usr/bin/env lua
local user_input = 0
local list = {}
while user_input ~= 'sort' do
print('输入数字值,或输入SORT开始排序')
user_input = io.read():lower()
-- 'sort'这个单词不返回数字,因此没有最终插入
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()
2020-11-23 19:55:52
用户10480373
下面是我的实现方法,几点说明:
我的 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,它与 ipairs() 完全相同。如果您有任何后续问题,请在下面留言! :)
2021-02-15 21:09:27
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

在 Lua 中,有两个函数可以创建表的迭代器pairs和ipairs。
使用
pairs,产生的顺序是不确定的,它将返回所有的键值对,但无法保证顺序。{1,2,3,4,5}的输出可能是5,2,4,1,3ipairs的顺序是从1到第一个nil,它不会返回任何非整数键。使用
pairs,您的算法输出可能是正确的,但由于pairs的顺序而出现错误。 因此,您应该使用ipairs来评估您的算法输出,以便通过索引排序。现在,您的算法不会执行冒泡排序,如果您想,我可以为此提供更正。 为了这个初始答案,我认为澄清会创建不一致输出的内容应该指向正确的方向。
冒泡排序应该“一次”对1个索引进行排序,第一次通过将排列数组的最后一个值。 然后每次通过排序以下位置。 例如:
2,1,3,4,5,8,7,6之前1,2,3,4,5,7,6,8之后维基百科有各种排序算法的非常好的页面,其中包含可以真正帮助理解其如何运作的 gif 图像:冒泡排序