引入:
其实它和玩扑克牌的原理是一样的(用升序来举例):先拿第一张牌,再拿第二张牌,从后往前比较,此时只能与第一张牌比较(如果第二张牌的点数更大,把它放在第一张牌的后面,否则放在前面),然后拿第三张牌,将它从后往前比较,把它插入到合适的位置,使手上的牌仍然保持升序,接下来的牌都跟前面的操作相同。
基本思路:让 end 指向第一个数,先用 tmp 保存下标为(end + 1)的数,再将 tmp 依次与
下标从 end 到 0 的数(从后往前)比较(符号方向依是升序还是降序来定,且该步需要挪动元素),把 tmp 存的值插入到合适的位置。
将上面的基本思路做成一个循环(让 end 的指向范围为 [ 0 , n-1 ] )
可以发现,
手上现有的牌 ---------------->下标从 0 到 end 的元素tmp ----------------> 新拿的一张牌
从后往前比较,将牌插入到合适的位置 ----------------> 将 tmp 与 下标从 end 到 0
的元素比较(需要挪动元素),把 tmp 存的值插入到合适的位置
于是,每执行完一次循环后,下标从 0 到 end 的元素都是有序的。
代码实现
void InsertSort(int* a,int n)
{
for (int i = 0; i < n - 1;i++)
{
int end = i; //赋值给end,使得end位置后移,外扩
int tmp = a[end + 1];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
end--; //靠end后退来实现两数比较
}
else
break;
}
a[end + 1] = tmp;
}
}