算法思路
- 维护一段有序数列
- 同时遍历待排序数列,在有序数列中找到合适的位置插入元素
基本代码
实现如下:
void insertion(vector<int>& arr){
for(int i=1;i<arr.size();i++){
int temp=i;
for(int j=i-1;j>=0;j--){//有序序列不断得增加
if(arr[temp]<arr[j]) {//待排序数列中的数小于有序数列中的数,则插入
swap(arr[temp],arr[j]);//每发现一个小于待排序的元素时则交换
temp --;
}
}
}
}
优化:
找到当前待插入元素的位置之后再插入,减少交换次数
void insertion1(vector<int>& arr){
for(int i=1;i<arr.size();i++){
int temp=arr[i];
int j=i-1;
for(;j>=0 && temp<arr[j];j--){//移动有序数列的元素位置
arr[j+1] = arr[j];
}
arr[j+1] = temp;//插入元素
}
}
算法分析
时间复杂度:最优一次遍历排序完成O(n);最差是O(n^2),逆序数组,每次插入元素都要比较已排序的元素个数次。
空间复杂度:O(1),临时变量temp