004 插入排序(lua)

2024-06-29 1889阅读

文章目录

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

      004 插入排序(lua)
      (图片来源网络,侵删)

      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 
                      
                      
                      
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]