直接插入排序的思路是每次将一个新的数据插入到前面已经排好序的有序的数组中,重点是每次要找到插入的位置
代码:
void insertsort1(a[],n)
{
for(int i=1;i<n;i++)//寻找位置,有序情况下,不做改变,无序情况j的位置之后就是应该插入的位置
for(int j=i-1;j>=0;j--)
if(a[j]<a[i])
break;
if(j!=i-1)//如果无序,就进行插入操作,插入位置之后的数据都后移,位置不断前移,直到应该插入的位置进行插入完成排序
{
int temp=a[i];
for(int k=i-1;k>j;k--)
a[k+1]=a[k];
a[k+1]=temp;
}
}
对其可进行代码优化,将前移过程和搜索过程合并,比较a[i]和a[i+1]的大小如果有序则不处理如果无序,将a[i+1]插入a[0]到a[i]有序的数组中去,完成插入排序
代码:
void insertsort2(a[],n)
{
for(int i=1;i<n;i++)
{
if(a[i-1]>a[i])//如果无序则将a[i]插入前面有序数组中
{
int temp=a[i];
for(int j=i-1;j>=0&&a[j]>temp;j--)从i-1的位置开始前移,直到找到应该插入的位置
a[j+1]=a[j];
a[j+1]=temp;
}
}
}
还可以通过交换的方式替换掉后移的方式,碰到无序的数字进行交换,在前面有序的数组中继续比较继续进行交换直到有序,即该数已经到达正确的位置
void insertsort3(a[],n)
{
for(int i=1;i<n;i++)
{
if(a[i-1]>a[i])
{
for(int j=i-1;j>=0&&a[j]>a[j+1];j--)
swap(a[j],a[j+1]);
}
}
}