插入排序的基本思想是:将整个数组a分为有序和无序的两个部分。前者在左边,后者在右边。开始有序的部分只有a[0] , 其余都属于无序的部分。每次取出无序部分的第一个(最左边)元素,把它加入有序部分。假设插入合适的位置p,则原p位置及其后面的有序部分元素都向右移动一个位置,有序的部分即增加了一个元素。一直做下去,直到无序的部分没有元素。
这个也有稳定不稳定之分,如果不清楚的话,浏览这个文章:https://blog.csdn.net/qq_41045071/article/details/81053250
程序如下:
void InsertionSort(int a[], int size)
{
for(int i = 1;i < size;i++){
//a[i]是最左边的无序元素,每次循环将a[i]放到合适位置
for(int j = 0;j < i;j++){
if(a[j] > a[i]){
//要把a[i]放到位置j,原下标j到i-1的元素都往后移一位
int tmp = a[i];
for(int k = i;k > j;k--;)
a[k] = a[k-1];
a[j] = tmp;
break;
}
}
}
}
复杂度分析:外重循环需要执行(size-1)次。每次外重循环执行时,假设在j=n时执行了第12行的break语句,则此时第6行的a[j]>a[i]已经被执行了n+1次。当j=n时,会执行第9行的循环,该循环的k>j这个判断会被执行i-j+1次,即i-n+1次。于是,每次外重循环执行时,两种操作合计执行i+2次。也可以定义一种操作,叫作“执行a[j]>a[i]或k>j”,则每次执行外重循环时,该操作一共被执行i+2次。i从1变到size-1,因此合计执行次数为3+4+...+(size+1),这个复杂度也是
O(size^2)的。