什么是插入排序算法?
插入排序是一种基于数组遍历并为每个元素寻找正确位置的排序技术。它会将当前元素与其前驱元素进行比较,如果当前元素较小,则继续向前比较。通过移动所有比它大的元素,为当前交换出的元素腾出空间。
插入排序的工作原理
让我们考虑一个示例数组:arr = [ 64, 25, 12, 22, 11]。
步骤 1: 使用变量 i 通过 for 循环遍历数组。
[ 64, 25, 12, 22, 11] // 原始数组
步骤 2: 当 i = 0 时(即第一个索引),因为它是第一个元素,所以数组不会发生任何变化。
[ 64, 25, 12, 22, 11] // key = 64, i = 0
步骤 3: 当 INLINECODE7ea2fb15 时,将该值存储为 INLINECODE3242d56e,并检查前面的元素是否比它大。如果是,则将 key 与所有较大的前驱元素进行交换。
[ 64, 25, 12, 22, 11] -> [25, 64, 12, 22, 11] // key = 25, i = 1
步骤 4: 由于索引 3 处的值(即 12)比所有的前驱元素都小,它们都将通过另一个 for 循环与 12 进行交换,该循环从 INLINECODEe33463d1 到 INLINECODE42a2ff33 索引反向运行。
[25, 64, 12, 22, 11] -> [25, 12, 64, 22, 11] -> [ 12, 25, 64, 22, 11] // key = 12, i = 2
步骤 5: 现在对于 i = 3(即 22),只有 2 个前驱元素比它大,因此它只会向后交换最多 2 个位置,如图所示。
[ 12, 25, 64, 22, 11] -> [ 12, 25, 22, 64, 11] -> [ 12, 22, 25, 64, 11] // key = 22, i = 3
步骤 6: 现在,对于最后一个索引,由于它是数组中最小的元素,因此在使用 for 循环时,它将在临时变量 key 的帮助下被交换回 0 索引位置。
[ 12, 22, 25, 64, 11] -> [ 12, 22, 25, 11, 64] -> [ 12, 22, 11, 25, 64] -> [ 12, 11, 22, 25, 64] -> [11, 12, 22, 25, 64] // key = 11, i = 4
插入排序的编程实现方法
- 为了使用插入排序对数组进行排序,我们首先使用 for 循环遍历数组,并始终将当前元素保存在一个临时变量或
key中。 - 在每一次迭代中,我们将 INLINECODE5194d8c1 的值与所有之前的元素进行比较。如果 INLINECODE2c0a7b68 的值更大,则什么都不做;但如果它更小,则向后交换所有前驱元素,直到该值到达正确的位置,即左边的元素更小,右边的元素更大。
- 完成包含上述步骤的所有迭代,并返回最终排序好的数组。
示例:
JavaScript
CODEBLOCK_65e26790
输出结果
Original array: 64,25,12,22,11
After sorting: 11,12,22,25,64
总结
插入排序是一种简单且易于理解的算法,它通过遍历并与前驱元素比较数值,将数值与所有较大的元素进行交换。插入排序的时间复杂度是 O(N2),所需的辅助空间是 O(N)。基本上,插入排序对于小数据量非常有效。插入排序具有自适应性,即它适用于已经部分排序的数据集。