一、插入算法概述
- 定义
- 插入算法是一种常见的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
- 适用场景
- 插入算法适用于数据量较小,且数据基本有序的情况。它在这种场景下能够高效地对数据进行排序。
二、直接插入排序
- 算法原理
- 假设数组
arr
,初始时,将arr[0]
视为已排序序列,arr[1]
到arr[n - 1]
视为未排序序列(n
为数组长度)。 - 从
i = 1
开始,将arr[i]
与已排序序列中的元素从后向前比较。如果arr[i]
小于已排序序列中的元素,则将该元素向后移动一位,直到找到合适的位置将arr[i]
插入。 - 重复这个过程,直到所有元素都插入到已排序序列中。
- 假设数组
- C 语言示例代码
展开过程
- 这里
key
是当前要插入的元素,while
循环用于在已排序序列中找到key
的合适插入位置。
-
时间复杂度
- 最好情况:当数组已经有序时,每次只需要比较一次就能确定插入位置,时间复杂度为。
- 最坏情况:当数组逆序时,每次插入都需要移动大量元素,时间复杂度为。
- 平均情况:时间复杂度为。
-
空间复杂度
- 插入排序只需要常数级的额外空间,空间复杂度为。
三、希尔排序(改进的插入排序)
- 算法原理
- 希尔排序是对直接插入排序的改进。它的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 "基本有序" 时,再对全体记录进行一次直接插入排序。
- 子序列的构成不是简单地逐段分割,而是将相隔某个 "增量" 的记录组成子序列。
- C 语言示例代码
展开过程
- 这里
gap
是增量,通过不断缩小增量来对数组进行排序。
- 时间复杂度
- 希尔排序的时间复杂度与增量序列的选择有关,平均时间复杂度在左右。
- 空间复杂度
- 空间复杂度为。
插入算法是一种简单而实用的排序算法,在特定场景下能够发挥很好的排序效果,并且通过改进(如希尔排序)还能在一定程度上提高排序效率