一、直接插入排序
基本操作是将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增1的有序表。
算法步骤:
①设待排序的记录存放在数组r[1...n]中,r[1]是一个有序序列;
②循环n-1次,每次使用顺序查找法,查找r[i](i=2...n)在已排好序的序列r[1...i-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1...i-1],直到r[n]插入表长为n-1的有序序列r[1...n-1],最后得到一个表长为n的有序序列。
void insertsort(nodetype r[],int n)
{//对顺序表r做直接插入排序
int i,j,k;
for(i=2;i<=n;++i)
{
if(r[i].key<r[i-1].key)//“<”,需将r[i]插入有序表
{
r[0].key=r[i].key;//将待插入的记录暂存到监视哨中
r[i].key=r[i-1].key;//r[i-1]后移
for(j=i-2;r[0].key<r[j].key;--j)//从后向前寻找插入位置
r[j+1].key=r[j].key;
r[j+1].key=r[0].key;//将r[0]即原r[i],插入到正确位置
}
}
}
算法的时间复杂度:O(n2) //n的平方<