直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
直接插入排序(straight insertion sort)的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
int insert_sort(int a[],int n) { int i,j,sorted,temp2; for (i=1;i<n;i++) { for (j=i;j>0;j--) { if (a[j-1]>a[j]) { temp2=a[j-1]; a[j-1]=a[j]; a[j]=temp2; } else { break; } } } }
以上实现的是。如果i与i-1比较,如何换位置条件,那么换位置。一直到不需要换位置为止。这个过程。起到两个作用,一是找位置,一是换位置。
但是我们知道在for循环内的if条件判断起到的作用是需不需要所以下操作。在本排序算法中,我们明确只到如果不比较的话,就是已经可以。需要跳出本次for循环
我们首先想到的是使用break;
代码如下:
int insert_sort(int a[],int n)
{
int num;
int i,j,sorted,temp2;
num=0;
for (i=1;i<n;i++)
{
for (j=i;j>0;j--)
{
if (a[j-1]>a[j])
{
temp2=a[j-1];
a[j-1]=a[j];
a[j]=temp2;
}
else
{
break;
}
num++;
}
}
printf("insert num:%d\n",num);
}
我们知道for循环的意义。for(a;b;c),首先进行a操作。然后进行一下{}内的操作。操作完毕后,进行b判断。若b为真,则进行c操作。然后再开始{}内存。我们何不把if()条件删选移植for循环内部呢?
代码如下:
int insert_sort3(int a[],int n)
{
int num;
int i,j,sorted,temp2;
num=0;
for (i=1;i<n;i++)
{
for (j=i;j>0&&(a[j-1]>a[j]);j--)
{
//if (a[j-1]>a[j])
//{
temp2=a[j-1];
a[j-1]=a[j];
a[j]=temp2;
//}
num++;
}
}
printf("insert num:%d\n",num);
}