Lua 选择排序怎么实现?

文章导读
Previous Quiz Next 选择排序(Selection Sort)从列表的未排序部分中反复选择最小元素,然后将其与未排序列表的第一个元素交换。
📋 目录
  1. A 时间复杂度
  2. B 空间复杂度
  3. C 何时使用选择排序
A A

Lua - 选择排序



Previous
Quiz
Next

选择排序(Selection Sort)从列表的未排序部分中反复选择最小元素,然后将其与未排序列表的第一个元素交换。

main.lua

-- 使用选择排序对列表进行排序的函数
function selection_sort(list)
   -- 列表的长度
   local n = #list 
   -- 从第1个元素开始迭代到倒数第二个元素
   for i = 1, n-1 do 
      -- 初始化最小元素的索引
      local minIndex = i 
      -- 在列表的未排序部分找到最小元素的索引
      for j = i + 1, n do
         if list[j] < list[minIndex] then
            minIndex = j -- minIndex 应指向最小元素
         end
      end

      -- 将 minIndex 与第一个元素交换
      if minIndex ~= i then
         list[i], list[minIndex] = list[minIndex], list[i]
      end
   end
   -- 列表已排序,返回它
   return list 
end

-- 示例用法:
local numbers = {5, 1, 4, 2, 8}
local sorted = selection_sort(numbers)
print("Sorted list:", table.concat(sorted, ", "))

输出

运行上述程序时,我们将得到以下输出−

Sorted list:	1, 2, 4, 5, 8

选择排序的工作原理

  • 遍历每个元素 − 我们从第1个元素开始循环到倒数第二个元素。每次迭代的目标是将正确元素放置在第 i 个位置。

  • 找到最小值 − 使用 minIndex 获取最小元素的索引。使用内层循环遍历列表的未排序部分并获取最小元素的索引。

  • 交换 − 内层循环完成后,如果 minIndexi 不同,则交换值,将未排序列表的最小元素放置在其正确位置。

  • 重复过程 − 外层循环继续,每次迭代后,将每个迭代的最小元素放置在其正确位置。

  • 构建排序列表 − 重复上述步骤直到列表排序完成。

时间复杂度

  • O(n2) − n 为元素数量,因为我们总是循环内层循环。外层循环运行 n-1 次,内层循环平均运行 n/2 次。因此,最坏情况、最佳情况和平均时间复杂度均为 O(n2)

空间复杂度

  • O(1) − 选择排序的空间复杂度是常数,因为它不需要从列表中额外分配内存用于临时存储。

何时使用选择排序

选择排序简单易学,适用于以下场景 −

  • 教育目的 − 由于简单易学/教授,选择排序常用于教育目的。

  • 小数据集 − 对于小数据集,选择排序的性能与其他算法相当。

  • 较少交换 − 如果交换操作成本高,选择排序很有用,因为它执行的交换次数最少,为 O(n)。