
在计算机科学的世界里,排序算法就像是一把神奇的梳子,能够将杂乱无章的数据梳理得井井有条。插入排序便是众多排序算法中一种简单且实用的算法,下面我们就来深入探究它的基本思想。
插入排序的核心思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、长度加一的有序数据。这一过程就如同我们玩扑克牌时整理手中牌的过程。当我们拿到一张新牌时,会将它插入到手中已经排好顺序的牌中的合适位置,使得手中的牌始终保持有序。
插入排序通常从第二个元素开始,依次将每个元素插入到前面已经排好序的子数组中。具体步骤如下:
为了更直观地理解插入排序的过程,我们来看一个具体的例子。假设有一个数组 [5, 3, 4, 6, 2],我们将使用插入排序对其进行排序。
3。3 和前面已排序子数组 [5] 中的元素,从后往前比较。3 < 5,将 5 后移一位,得到 [_, 5]。3 插入到该位置,得到 [3, 5]。4。4 和前面已排序子数组 [3, 5] 中的元素,从后往前比较。4 < 5,将 5 后移一位,得到 [3, _, 5]。4 和 3,由于 4 > 3,找到合适的位置,将 4 插入到该位置,得到 [3, 4, 5]。6。6 和前面已排序子数组 [3, 4, 5] 中的元素,从后往前比较。6 > 5,不需要移动元素,直接将 6 插入到 5 后面,得到 [3, 4, 5, 6]。2。2 和前面已排序子数组 [3, 4, 5, 6] 中的元素,从后往前比较。2 < 6,将 6 后移一位,得到 [3, 4, 5, _, 6]。2 < 5,将 5 后移一位,得到 [3, 4, _, 5, 6]。2 < 4,将 4 后移一位,得到 [3, _, 4, 5, 6]。2 < 3,将 3 后移一位,得到 [_, 3, 4, 5, 6]。2 插入到该位置,得到 [2, 3, 4, 5, 6]。整个排序过程结束,数组已经按照升序排列。
下面是用表格总结每一轮排序的结果:
| 轮数 | 已排序子数组 | 待插入元素 | 插入后数组 |
| —— | —— | —— | —— |
| 1 | [5] | 3 | [3, 5] |
| 2 | [3, 5] | 4 | [3, 4, 5] |
| 3 | [3, 4, 5] | 6 | [3, 4, 5, 6] |
| 4 | [3, 4, 5, 6] | 2 | [2, 3, 4, 5, 6] |
def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr# 测试代码arr = [5, 3, 4, 6, 2]sorted_arr = insertion_sort(arr)print(sorted_arr)
插入排序是一种简单易懂的排序算法,它的基本思想是通过不断地将元素插入到已排序的子数组中,最终得到一个有序的数组。虽然插入排序的时间复杂度在最坏情况下较高,但在处理小规模数据或部分有序的数据时,它的性能表现还是比较不错的。同时,插入排序的空间复杂度较低,只需要常数级的额外空间。希望通过本文的介绍,你能对插入排序的基本思想有更深入的理解。