4-3 比较排序:插入排序
插入排序算法
插入排序是一种简单的排序算法,它的工作原理是迭代地将无序列表中的每个元素插入到已排序部分的正确位置。这就像整理手中的扑克牌一样。你把牌分成两组:已排序的牌和未排序的牌。然后,你从未排序的牌组中抽取一张牌,并将其插入到已排序牌组的正确位置。
- 假设第一个元素已排序,则从第二个元素开始排序。
- 将第二个元素与第一个元素进行比较,如果第二个元素较小,则交换它们。
- 移至第三个元素,将其与前两个元素进行比较,并将其放置在正确的位置。
- 重复此操作,直到整个数组排序完成。
代码实现
// C++ program for implementation of Insertion Sort
#include <iostream>
/* Function to sort array using insertion sort */
void insertionSort(int arr[], int n)
{
for (int i = 1; i < n; ++i)
{
int key = arr[i];
int j = i - 1;
/* Move elements of arr[0..i-1], that are
greater than key, to one position ahead
of their current position */
while (j >= 0 && arr[j] > key)
{
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
/* A utility function to print array of size n */
void printArray(int arr[], int n)
{
for (int i = 0; i < n; ++i)
{
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
// Driver method
int main()
{
int arr[] = { 12, 11, 13, 5, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
insertionSort(arr, n);
printArray(arr, n);
return 0;
}
输出:

插入排序的复杂度分析、优缺点以及应用
插入排序的复杂度分析
时间复杂度
- 最佳情况:O(n),如果列表已经排序,其中 n 是列表中元素的数量。
- 平均情况:O(n² ),如果列表是随机排序的。
- 最坏情况:O(n² ),如果列表是逆序的
空间复杂性
辅助空间: O(1),插入排序需要O(1) 的额外空间,因此是一种空间高效的排序算法。
插入排序的优点
- 简单易行。
- 稳定的排序算法。
- 对于小型列表和接近有序的列表来说效率很高。
- 由于是原地算法,因此节省空间。
- 采用自适应方法。逆序对的数量与交换次数成正比。例如,对于已排序的数组,不会发生交换,时间复杂度仅为 O(n)。
插入排序的缺点
- 对于大型列表来说效率不高。
- 大多数情况下,它的效率不如其他排序算法(例如归并排序、快速排序)。
插入排序的应用:常用于以下情况
- 列表很短或者基本已排序。
- 简洁性和稳定性很重要。
- 用作桶排序中的子程序
- 当数组几乎已经排序(逆序对很少)时,这种方法很有用。
- 由于插入排序适用于小规模数组,因此它常与其他高效算法(例如快速排序和归并排序)一起用于混合排序算法中。当子数组规模变小时,这些递归算法会切换到插入排序。例如,IntroSort和TimSort就使用了插入排序。

浙公网安备 33010602011771号