插入排序就是给一个数组进行排序,按照从小到大或从大到小的顺序进行
分为有序表和无序表,有序表就是已经排好的部分,无序表就是未排序的部分
数组中的第一个元素构成的表一定是有序的,因为只有一个元素,所以以第一个元素作为有序表的基准
有序表(第一个元素一定是有序的),把第一个元素看作有序表,其他元素看作无序表
void insertSort(vector<int>& arr) {
if (arr.size() <= 1) {
return;
}
//j代表无序表第一个数的下标
for (int j = 1; j < arr.size(); j++) {
int i = j - 1;//j=1时,i代表数组的第一个元素,由于无法判断什么时候是无序的,但是 数组的第一个元素一定是有序的,i代表有序数组的最后一个元素
int tmp = arr[j];//用一个临时变量来记录当前所访问的无序表的元素下标
while (i >= 0&&tmp<arr[i])//一定要把i >= 0的条件放前,否则会出现错误,如果临时变量比有序表最后一个元素小,则需要找到tmp的合适位置,将有序表的数从最后一个向后依次移动
{
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = tmp;//如果临时变量比有序表最后一个元素大,则直接放在有序数组最后一个元素的后面
}
}
时间复杂度:
最优:O(n) 【假如原来就是有序的,每个元素只需和排好序的最后一个元素比一下即可放置,进行下一个数的比较】
最差:O(n^2)
平均:O(n^2)
空间复杂度:
不需要额外的空间占用,所以为O(1)。
稳定性:
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。