1、基本思想
将数组分为无序区和有序区,依次将无序区的元素按大小顺序插入到有序区中的适当位置,直到把无序区中元素全部移到有序区时排序完毕。
第一趟比较前两个数,然后把第二个数按大小插入到有序区中;
第二趟把第三个数与前两个数从后向前扫描,把第三个数按大小插入到有序表中;
依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
2、最优情况:(待排序数组已是有序数组)将无序区元素插入有序区中时只需作一次比较,而不需要移到有序区的其他元素。
最差情况:(待排序数组是逆序数组)将无序区元素插入有序区中时都要跟有序区中元素做比较。
3、直接插入排序属于稳定的排序。
最坏时间复杂度O(n^2),最好时间复杂度O(n),平均时间复杂度O(n^2)。空间复杂度O(1)。
4、代码
将elem[]数组按递增进行插入排序
void InsertSort(int *elem, int elemLen)
{
int i = 0;//i为无序区的元素序号
int j = 0;//j为有序区的元素序号
int tempElem = 0;//标记将要排序的元素
for(i = 1; i < elemLen; i++)//从第二个元素开始比较排序
{
if(elem[i] > elem[i-1])
{
continue;
}
tempElem = elem[i];
j = i-1;
while(j >= 0)//寻找插入有序区中的适当位置
{
if(elem[j] > tempElem)
{
elem[j+1] = elem[j];
j--;
}else
{
break;
}
}
elem[j+1] = tempElem;
}
}