当前位置: 首页 > news >正文

004 插入排序(lua)

文章目录

    • 1
    • 2
    • 3

1


-- 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,所以需要你根据具体需求实现这两个功能。  
-- 例如,你可以自己编写一个函数来生成随机数组,以及一个函数来测试排序算法。

-- 简单的随机数组生成函数  
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


-- 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


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, ", "))  -- 打印排序后的数组

相关文章:

004 插入排序(lua)

文章目录 123 1 -- Lua中没有类和方法的概念&#xff0c;所以我们将所有功能都写在一个脚本中 -- 交换数组中两个元素的功能 local function swap(arr, i, j) local temp arr[i] arr[i] arr[j] arr[j] temp end -- 插入排序算法的实现 local function insertionS…...

计算机网络 —— 基本概念

基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…...

高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的&#xff0c;如果想了解具体内容&#xff0c;可以移步至我的这篇博客&#xff1a;高精度加法计算的实现 在这里就不再详细讲解&#xff0c;只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …...

STM32CUBEMX配置USB虚拟串口

STM32CUBEMX配置USB虚拟串口 cubemx上默认配置即可。 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 配置完后生成工程&#xff0c;主要就是要知道串口的收发接口就行了。 发送&#xff1a;CDC_Transmit_FS()&#xff0c;同时记得包含头文件#include “…...

安卓开发中margin和padding的区别

在 Android 开发中&#xff0c;margin 和 padding 都是用来定义视图&#xff08;View&#xff09;的空间属性&#xff0c;但它们的作用和应用场景有所不同&#xff1a; Margin&#xff08;外边距&#xff09;&#xff1a; Margin 是视图与其他视图之间的空间。它定义了视图之间…...

Symfony事件调度系统:掌控应用程序生命周期的钥匙

Symfony事件调度系统&#xff1a;掌控应用程序生命周期的钥匙 引言 Symfony是一个高度灵活的PHP框架&#xff0c;用于构建各种规模的Web应用程序。它的核心特性之一是事件调度系统&#xff0c;该系统允许开发者在应用程序的生命周期中触发和监听事件。这种机制为开发者提供了…...

maven安装jar和pom到本地仓库

举例子我们要将 elastic-job-spring-boot-starter安装到本地的maven仓库&#xff0c;如下&#xff1a; <dependency><groupId>com.github.yinjihuan</groupId><artifactId>elastic-job-spring-boot-starter</artifactId><version>1.0.5&l…...

[leetcode]assign-cookies. 分发饼干

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i…...

如何轻松解决复杂文档格式转换问题

上周&#xff0c;我遇到了一个棘手的问题&#xff1a;需要将一大堆PDF文件转换成可编辑的Word文档&#xff0c;时间紧迫&#xff0c;手动转换根本来不及。朋友推荐我使用了一个网站——xuelin.cc&#xff0c;这个网站不仅提供强大的AI对话功能&#xff0c;还能轻松完成各种文档…...

日期类(java)

文章目录 第一代日期类 Date常用构造方法SimpleDateFormat 日期格式化类日期转字符串&#xff08;String -> Date)字符串转日期 (String->Date) 第二代日期类 Calendar常用字段与如何得到实例对象相关 API 第三代日期类&#xff08;LocalDate\TIme)日期&#xff0c;时间&…...

【深度学习】C++ Tensorrt Yolov8 目标检测推理

C Tensorrt Yolov8 目标检测推理 模型导出代码yolov8.hyolov8.cppcommon.hppCMakeListmain.cpp C tensorrt对yolov8目标检测模型进行推理。 Windows版本下只需要修改common.hpp对文件的判断S_ISREG 和对文件夹的判断S_ISDIR即可&#xff0c;非核心代码&#xff0c;不调用删掉都…...

【项目日记(二)】搜索引擎-索引制作

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.索引结构2.1创捷索引2.2根据索引查询2.3新增文档2.4内存索引保存到磁盘2.5把…...

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN&#xff08;K-Nearest Neihbor&#xff0c;KNN&#xff09;K近邻是机器学习算法中理论最简单&#xff0c;最好理解的算法…...

Eclipse + GDB + J-Link 的单片机程序调试实践

Eclipse GDB J-Link 的调试实践 本文介绍如何创建Eclipse的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 对 Eclipse 的要求 所用 Eclipse 应当安装了 Eclipse Embedded CDT 插件。从 https://www.eclipse.org/downloads/packages/ 下载 Ecli…...

前端代码生成辅助工具

1&#xff0c;Axure Axure设计的界面如何生成HTML文件 https://blog.csdn.net/qq_43279782/article/details/112387511 Axure 生成HTML 文件&#xff0c;并用Chrome打开 https://blog.csdn.net/qq_30718137/article/details/80621025 2&#xff0c;OpenUI [开源] OpenUI …...

静态库与动态库总结

一、库文件和头文件 所谓库文件&#xff0c;可以将其理解为压缩包文件&#xff0c;该文件内部通常包含不止一个目标文件&#xff08;也就是二进制文件&#xff09;。 值得一提的是&#xff0c;库文件中每个目标文件存储的代码&#xff0c;并非完整的程序&#xff0c;而是一个…...

深入解析tcpdump:网络数据包捕获与分析的利器

引言 在网络技术日新月异的今天&#xff0c;网络数据包的捕获与分析成为了网络管理员、安全专家以及开发人员不可或缺的技能。其中&#xff0c;tcpdump作为一款强大的网络数据包捕获分析工具&#xff0c;广泛应用于Linux系统中。本文将从技术人的角度&#xff0c;详细分析tcpdu…...

【漏洞复现】科立讯通信有限公司指挥调度管理平台uploadgps.php存在SQL注入

0x01 产品简介 科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案&#xff0c;以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、…...

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理&#xff1f; 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能的一个重要分支&#xff0c;旨在让计算机理解、解释和生成人类的自然语言。打个比方&#xff0c;你和Siri对话&#xff0c;或使用谷歌翻译翻译一…...

【linux】gcc快速入门教程

目录 一.gcc简介 二.gcc常用命令 一.gcc简介 gcc 是GNU Compiler Collection&#xff08;GNU编译器套件&#xff09;。就是一个编译器。编译一个源文件的时候可以直接使用&#xff0c;但是源文件数量太多时&#xff0c;就很不方便&#xff0c;于是就出现了make 工具 二.gcc…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...