直接排序,先保证前面2个数升序,在插入后面一个数,这个数的插入只需向前需找到第一个小于自己的数,插在前面即可
版本1:先找位置,在将其后的数据依次后移,需要3个变量ijk
//版本1,需要ijk三个变量:
void in_sort(int a[],int n)
{
int temp;
for(int i=1;i<n;i++)
{
temp=a[i];
for(int j=i-1;j>=0;j--)
if(a[j]<a[i])
break;//先找到位置
for(int k=i-1;k>j;k--)
a[k+1]=a[k];//同意向后移一位
a[k+1]=temp;
}
}
版本2:边比较边移动,此时只需要两个变量,但是需要注意,对每一个i,a[i]是可能被前面的数据覆盖修改的,因此比较的时候应该使用temp(暂存了之前a[i]的值):
//版本2,需要ij两个变量:
void in_sort(int a[],int n)
{
int temp;
for(int i=1;i<n;i++)
{
temp=a[i];
for(int j=i-1;j>=0;j--)
{
if(a[j]>temp)//边比较边移动,参考数不能为a[i],而应该是temp
a[j+1]=a[j];
}//边比较边移动
a[j+1]=temp;
}
}
上面的for和if有点重复了,for语句执行的次数是固定的,要把前面的数据全都遍历完,但这样就体现不出直接插入排序的优点了,复杂度较高,确切的说,应该不是直接插入!应该修改为:
void in_sort(int a[],int n)
{
int temp;
for(int i=1;i<n;i++)
{
temp=a[i];
for(int j=i-1;j>=0&&a[j]>temp;j--)//边比较边移动,参考数不能为a[i],而应该是temp
a[j+1]=a[j];//边比较边移动
a[j+1]=temp;
}
}
或者只是简单的添加个else break;
void in_sort(int a[],int n)
{
int temp;
for(int i=1;i<n;i++)
{
temp=a[i];
for(int j=i-1;j>=0;j--)
{
if(a[j]>temp)//边比较边移动,参考数不能为a[i],而应该是temp
a[j+1]=a[j];//边比较边移动
else break;
}
a[j+1]=temp;
}
}
//版本3,需要ij两个变量,且不需要temp,temp在swap中用到:
void in_sort(int a[],int n)
{
for(int i=1;i<n;i++)
for(int j=i;j>0&&a[j]<a[j-1];j--)
swap(a[j-1],a[j]);//a[j]<a[j-1]时,两数据交换
}