一、算法分析:
插入排序的工作方式类似于打牌时排序一手扑克牌:
下标j指出正被插入到手中的“当前牌”。
for循环(循环变量为j)每次迭代的开始,a[0]-a[j-1]的子数组构成当前左手中的牌。
剩余的子数组a[j+1]-a[LEN-1]相当于桌子上牌堆里面的牌。
二、循环不变式:
a[0]-a[j-1]就是原本0~j-1的元素,但现在已经排好序。我们把a[0]-a[j-1]的这些性质形式地表示为一个循环不变式。
循环不变式主要用于证明算法的正确性。关于循环不变式我们必须证明三点:
1、初始化:在第一次迭代之前,它为真。
2、保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
3、终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。
三、C语言代码:
#include <stdio.h>
#include <stdlib.h>
#define LEN 5
void InsertSort(double a[]);
int main()
{
double a[] = { 1.6,1.1,6.9,2.1,3 };
InsertSort(a);
system("pause");
}
void InsertSort(double a[])
{
double key;
int i, j;
for (j = 1; j < LEN; j++)
{
key = a[j];
i = j - 1;
while (i >= 0 && a[i] > a[j])
{
a[i + 1] = a[i];
i--;
a[i + 1] = key;
}
}
for (int k = 0; k < LEN; k++)
{
printf("%.2f \t", a[k]);
}
}