什么是插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
算法步骤
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素(已排序)大于新元素,将该元素移到下一位置。
- 重复步骤3,直到找到已排序的元素小于或者等于新元素。
- 将新元素插入到该位置后。
- 重复步骤2~5,直到所有元素都被插入完毕,完成排序。
插入排序的时间复杂度为O(n2),其中n是待排序数组的长度。在最坏情况下,即待排序数组逆序排列时,插入排序的时间复杂度达到最大值。然而,在小规模或部分有序的数组中,插入排序算法的效率是很高的。另外,插入排序是一种稳定的排序方法,即相等元素的相对顺序在排序后保持不变。
-- 插入排序
function insertionSort(arr)
local len = #arr
if len <= 1 then
return arr
end
for i = 2, len do
local key = arr[i] --从第二个数开始,与前面的序列数进行比较
local j = i - 1
-- 找到插入点
while j > 0 and arr[j] > key do -- 如果 数组前面得数比 key 大,话
arr[j + 1] = arr[j] -- 把数组前面排序好得数,往后依次挪一位数,从排序好得数得末尾开始,依次往后挪
j = j - 1 -- 指针往前挪动,再比较下一个排序好得数,与当前要插入得key,哪个大小,
end -- 如果当前排序好的数,比插入的key要小,则结束循环
-- 插入元素 结束while 循环后 说明 此时得 arr[j] 小于要插入得key, 则往排序好arr[j]的数后面插入key
arr[j + 1] = key
print(table.concat(arr,","))
end
return arr
end
-- 示例数组
local arr = {10, 5, 3, 8, 2, 6}
-- 对数组进行排序
local sortedArr = insertionSort(arr)
-- 打印排序后的数组
print(table.concat(arr,";"))
插入排序运行结果:
******插入排序********
5,10,3,8,2,6
3,5,10,8,2,6
3,5,8,10,2,6
2,3,5,8,10,6
2,3,5,6,8,10
2;3;5;6;8;10