文章目录
1
lua
-- Lua中没有类和方法的概念,所以我们将所有功能都写在一个脚本中
-- 交换数组中两个元素的功能
local function swap(arr, i, j)
local temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
end
-- 插入排序算法的实现
local function insertionSort(arr)
for i = 1, #arr do
for j = i, 2, -1 do -- 这是内嵌的第二个for循环,从当前的i值开始,递减到2。
if arr[j] < arr[j - 1] then
swap(arr, j, j - 1)
else
break
end
end
end
end
-- 主程序开始
local dataSize = {10000, 100000}
for _, n in ipairs(dataSize) do
-- 假设ArrayGenerator和SortingHelper在Lua中有对应的实现
-- 这里用伪代码代替,因为Lua没有这些库
local arr = ArrayGenerator.generateRandomArray(n, n) -- 伪代码,需要根据实际情况实现
SortingHelper.sortTest("InsertionSort", arr) -- 伪代码,需要根据实际情况实现
-- 对数组进行排序
insertionSort(arr)
-- 这里可以添加代码来验证排序结果或进行其他操作
end
-- 注意:Lua中没有ArrayGenerator和SortingHelper,所以需要你根据具体需求实现这两个功能。
-- 例如,你可以自己编写一个函数来生成随机数组,以及一个函数来测试排序算法。
lua
-- 简单的随机数组生成函数
local function generateRandomArray(n, max_value)
local arr = {}
for i = 1, n do
table.insert(arr, math.random(1, max_value))
end
return arr
end
-- 简单的排序验证函数
local function verifySort(arr)
for i = 2, #arr do
if arr[i - 1] > arr[i] then
print("Array is not sorted correctly!")
return false
end
end
print("Array is sorted correctly.")
return true
end
-- 在主程序中使用这些函数
for _, n in ipairs(dataSize) do
local arr = generateRandomArray(n, n) -- 生成随机数组
insertionSort(arr) -- 对数组进行排序
verifySort(arr) -- 验证排序结果
end
2
lua
-- InsertionSort.lua
function insertionSort(arr)
local n = #arr
for i = 2, n do -- Lua数组索引从1开始
local key = arr[i]
local j = i - 1
while j >= 1 and arr[j] > key do
arr[j + 1] = arr[j]
j = j - 1
end
arr[j + 1] = key
end
end
function swap(arr, i, j)
local temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
end
-- 示例用法和测试排序函数
function sortTest(sortName, arr)
local startTime = os.clock()
if sortName == "InsertionSort" then
insertionSort(arr)
end
local endTime = os.clock()
local time = endTime - startTime
-- 检查数组是否已排序
local isSorted = true
for i = 2, #arr do
if arr[i-1] > arr[i] then
isSorted = false
break
end
end
if not isSorted then
error(sortName .. " failed")
end
print(string.format("%s, n = %d: %f s", sortName, #arr, time))
end
-- 假设的ArrayGenerator.generateRandomArray函数的Lua实现
function generateRandomArray(n, max)
local arr = {}
for i = 1, n do
table.insert(arr, math.random(1, max))
end
return arr
end
-- 主程序入口
local dataSize = {10000, 100000}
for _, n in ipairs(dataSize) do
local arr = generateRandomArray(n, n)
sortTest("InsertionSort", arr)
end
while j >= 1 and arr[j] > key do
arr[j + 1] = arr[j]
j = j - 1
end
arr[j + 1] = key
while j >= 1 and arr[j] > key do:这是一个while循环,其条件有两个部分:j >= 1 和 arr[j] > key。
j >= 1 确保我们不会超出数组的左边界。
arr[j] > key 检查当前j位置的元素是否大于key。如果大于,那么我们需要将key插入到这个位置之前,即将arr[j]及其后面的元素向右移动一位。
arr[j + 1] = arr[j]:
这行代码将j位置的元素向右移动一位,即放到j + 1的位置。这是为了给key腾出插入的位置。
j = j - 1:
将j减1,以便在下一次循环中检查前一个元素。这样我们可以继续向左检查,直到找到一个不大于key的元素或者到达数组的开头。
当while循环结束时,我们已经找到了key应该插入的位置,即j + 1。此时,arr[j]是不大于key的第一个元素(或者我们已经到达了数组的开头)。
arr[j + 1] = key:
最后,我们将key插入到正确的位置,即j + 1。
简而言之,这段代码通过不断地将大于key的元素向右移动,为key腾出插入的位置,并最终将key插入到已排序部分的正确位置,从而确保数组左侧始终保持有序。
外部循环从数组的第二个元素开始(for i = 2, n do),因为第一个元素默认是已排序的(只有一个元素)。在每次外部循环开始时,key 被设置为arr[i],即当前要插入排序的元素。
内部while循环负责找到key的正确插入位置。它通过比较key与已排序子数组中的元素(arr[j])来工作,如果arr[j]大于key,则将arr[j]向右移动一位。
key的值在内部循环期间确实保持不变,这是因为我们正在尝试为当前key找到正确的插入位置。一旦找到,key就会被插入到arr[j + 1]。
外部循环继续,i递增,key被设置为新的arr[i],然后重复上述过程。
因此,尽管key在内部while循环中保持不变,但它会随着外部for循环的每次迭代而更新。这使得算法能够逐个处理数组中的每个元素,并将它们插入到已排序的子数组中。
简而言之,key不是全局常量,而是在每次外部循环迭代中重新赋值的局部变量。这使得比较有意义,因为key的值在每次迭代中都在变化,代表当前需要插入排序的元素。
3
lua
function insertion_sort(arr)
local length = #arr
for i = 1, length do
local temp = arr[i]
local j = i
for j = i, 2, -1 do
if temp < arr[j - 1] then
arr[j] = arr[j - 1]
else
break
end
end
arr[j] = temp
end
end
-- 示例使用
local arr = {4, 3, 2, 10, 12, 1, 5, 6}
print(table.concat(arr, ", ")) -- 打印排序前的数组
insertion_sort(arr)
print(table.concat(arr, ", ")) -- 打印排序后的数组