思想:对顺序表或一维数组进行直接插入排序。把无序序列的一个关键字作为有序序列,从之后的无序序列一次插入到有序序列当中,将待插关键字与有序序列从后往前依次比较,若比有序序列第j个关键字小,则将第j个及其以后的关键字后移,将待插关键字插入到第j个位置,直到无序序列中所有关键字都已插入,排序结束。
直插、折半、希尔都是插入类排序,该类排序特点是在未完成一趟排序之前,所有的关键字均未到达最终为位置。
性能分析:最坏情况下 逆序 执行次数n*(n-1)/2次 时间复杂度为O(n²); 最坏情况下 有序 执行次数 n-1次 时间复杂度O(n) 空间复杂度常量级O(1)
void InsertSort(int A[],int n)
{
int i,j,temp;
for(i=1;i<n;++i) //从数组第二个元素开始,第一个元素默认有序
{
temp=A[i];
j=i-1;
while(j>=0&&temp<A[j])
{
A[j+1]=A[j]; // 下标为j及以后的元素后移
--j;
}
A[j+1]=temp; //插入关键字(注意是j+1,循环体多减了1)
}
}