时间复杂度:最好O(n) 最坏O(n²) 平均O(n²)
空间复杂度:O(1)
稳定性:稳定
核心思想:
核心思想:,分成两部分,一部分有序,一部分无序,将无序元素依次插入到有序的里面
如果插入里面没有交换操作,要走n-1趟
1.标记有序的右边界,无序的左边界
2.循环将无序插入到有序
2.1保存当前的无序元素
2.2倒序遍历有序数组,进行比较比有序大就放在有序的后面,比有序小就有序最后一个后移,无序的继续向前比较
实现:
void insertSort(vector<int>& arr) {
for (int i = 1; i < arr.size(); i++)
{
int j = i - 1;//有序的最后一个元素坐标
int temp = arr[i];//无序的第一个元素,也是即将插入的值
while (j>=0&&temp<arr[j])
{
//插入的无序元素比当前有序元素小
//说明一定会插入在该有序元素前面那么就将有序元素后移
arr[j + 1] = arr[j];
//查看前面的元素和插入值的大小关系
j--;
}
//比有序的大就插入在他的后面,
//或者走到-1了说明他比所有有序元素都小就将无序元素放在头部
arr[j + 1] = temp;
}
}