思路:例如 3,4,1,7,6
1、首先遍历数组,无容置疑
2、假设第一个数是排列好的,所以我们从第二个数开始比较,为了更好的进行数组移动,我们定义一个key来保存遍历到的值
3、定义j=i-1,每次从前一个数和arr[i]比较,直到遍历到小于key后者j<0;就结束遍历
void insertion_sort(int arr[], int len){
int i,j,key;
for (i=1;i<len;i++){
key = arr[i]; //将遍历到的数保存到key值
j=i-1;
while((j>=0) && (arr[j]>key)) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
特性
1.时间复杂度
最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n )
最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O(n^2)
综上,因此直接插入排序的平均时间复杂度为O(n^2)
2.空间复杂度
辅助空间是常量
平均的空间复杂度为:O ( 1 )
3.算法稳定性
相同元素的前后顺序是否改变
插入到比它大的数前面,所以直接插入排序是稳定的