插入排序
前置学习
了解排序的基本概念
点击传送门
原理
直接插入排序(Straight Insertion Sort) 基本操作是:将一个记录插入到已经排好序的有序数据中,从而得到一个新的、记录数增加1的有序表。
实现
把待排序序列视为两部分:
- 一部分为有序序列,通常在排序开始之时将序列中的第一个数据视为一个有序序列;
- 另一部分为待排序序列,有序序列之后的数据视为待排序序列。
- 在排序开始之时,从序列头部到尾部逐个选取数据,与有序序列中的数据,按照从尾部到头部的顺序逐个比较,直到找到合适的位置,将数据插入其中。
代码
//定义数组
int arr[10] = { 9,1,5,6,10,8,3,7,2,4 };
//数组元素个数
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 1; i < len; i++)
{
//将无序数据插入到有序数据中
int temp = arr[i];//设置哨兵
if (temp < arr[i - 1])
{
//依次移动数据到指定位置
for (int j = i - 1; j >= 0 && temp < arr[j]; j--)
{
//移动数据
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
复杂度分析
时间复杂度:
平均时间复杂度:O(n²)
最好时间复杂度:O(n)
最坏时间复杂度:O(n²)
如果排序的数据是随机的,根据概率相同原则,平均比较和移动的次数应为n²/4次,得出直接插入排序的时间复杂度为O(n²)。在同样的时间复杂度中直接插入排序要优于选择排序和冒泡排序。
空间复杂度:
O(1),只需要一个额外空间用于交换。
稳定性:
稳定排序