004 插入排序(lua)

文章目录

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 arrj > key do

arrj + 1 = arrj

j = j - 1

end

arrj + 1 = key
while j >= 1 and arrj > key do:

这是一个while循环,其条件有两个部分:j >= 1 和 arrj > key。

j >= 1 确保我们不会超出数组的左边界。

arrj > key 检查当前j位置的元素是否大于key。如果大于,那么我们需要将key插入到这个位置之前,即将arrj及其后面的元素向右移动一位。

arrj + 1 = arrj

这行代码将j位置的元素向右移动一位,即放到j + 1的位置。这是为了给key腾出插入的位置。

j = j - 1:

将j减1,以便在下一次循环中检查前一个元素。这样我们可以继续向左检查,直到找到一个不大于key的元素或者到达数组的开头。

当while循环结束时,我们已经找到了key应该插入的位置,即j + 1。此时,arrj是不大于key的第一个元素(或者我们已经到达了数组的开头)。

arrj + 1 = key:

最后,我们将key插入到正确的位置,即j + 1。

简而言之,这段代码通过不断地将大于key的元素向右移动,为key腾出插入的位置,并最终将key插入到已排序部分的正确位置,从而确保数组左侧始终保持有序。
外部循环从数组的第二个元素开始(for i = 2, n do),因为第一个元素默认是已排序的(只有一个元素)。

在每次外部循环开始时,key 被设置为arri,即当前要插入排序的元素。

内部while循环负责找到key的正确插入位置。它通过比较key与已排序子数组中的元素(arrj)来工作,如果arrj大于key,则将arrj向右移动一位。

key的值在内部循环期间确实保持不变,这是因为我们正在尝试为当前key找到正确的插入位置。一旦找到,key就会被插入到arrj + 1

外部循环继续,i递增,key被设置为新的arri,然后重复上述过程。

因此,尽管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, ", "))  -- 打印排序后的数组
相关推荐
小智老师PMP16 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN21 分钟前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183134 分钟前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate2 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran2 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹2 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年3 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨3 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木3 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法