一开始把第一个元素看成是有序的,然后从第二个元素开始拿出来与前面的数据比较,若前面的数据小,就把前面的数据不断后移(注意要把拿出来的那个元素提前保存下来),直到遇到比自己小的元素,然后插入到它的后面。再拿出第三个元素来,之后依次拿出来与前面相比较。这样就保证了拿出来的元素之前的所有元素都是有序的。
时间复杂度:
最坏O(N^2)------>此时原数组为逆序排列
最好O(N)--------->此时原数组顺序有序
//为什么tmp最后赋值要放在循环外面?
看下面这张图,1插入的过程中end不断--,end最后等于-1,但是循环可以进行的条件是end>=0,所以会提前结束然后tmp并没有保存到下标为0的位置,这样就错了。
//注意外部循环i是从0到n-2,因为你要拿出来的元素是从1到n-1,拿出来的元素下标为end+1,由此可以得出end的取值范围i
void InsertSort(int* a, int n)
{
// [0, n-1]
for (int i = 0; i < n-1; i++)
{
// [0,end]有序 end+1位置的值插入[0,end],保持有序
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
--end;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}