前面,我们提到了,冒泡排序非标准版,标准版,优化版,和选择排序,下面我们来说下直接插入排序
直接插入排序的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,是有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中;
第二趟把第三个数据与前两个数从后往前扫描,把第三个数按大小插入到有序表中;
依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。
内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找出比待比较数值小的并将待比较数值置于其后一位置,结束该次循环。
下面给出C代码:
void InsertSort(SqList *L){ int i,j; for(i=2;i<=L->length;i++){ if(L->r[i]<L->r[i-1]){ L->r[0] = L->r[i]; for(j=i-1;j>0&&L->r[j]>L->r[0];j--){ L->r[j+1] = L->r[j]; } L->r[j+1] = L->r[0]; } } }
上面的例子中,我们从数组的第3个位置开始循环,取下标2
因为我们数组的第一个位置用作中间变量,所以数字的比较从第二个位置开始
首先,我们判断当前的数值是否小于前面的数值,如果小,则开始设置变量,进行比较。
先将当前的数值赋给中间变量,
开始第二层循环,条件是,从当前数值的前一个数值开始,
如果判断当前值小于前一个数值,则将前一个数值的位置往后+1,这样,当前值就会被覆盖掉了。
然后被比较的数值下标-1,然后继续循环比较。
至少当前值不在小于被比较的值,循环结束,当然,被循环数值的下标还是要-1;
这样,当循环体结束的时候,比当前值大的数值,它们的位置都会往后移一格。
最后挪动的那个数值,它原先的位置,我们将中间变量赋值给它,那么也就完成了这次排序
因为我们for循环体之后都要j--,
那么最后数值移动的位置我们要加回来
就是r[j+1].
所以L->r[j+1]=L->r[0]; 就是把中间变量插入到指定的位置
下面给出java代码:
public Class DirectSort{
public static void main(String args[]){
int a[]={46,58,15,45,90,18,10,62};
int n = a.length;
int i,j;
for(i=1;i<n;i++){
int temp = a[i];
for(j=i-1;j>=0&&temp<a[j];j--){
a[j+1]=a[j];
}
a[j+1]=temp;
}
for(i=1;i<n;i++){
System.out.print(a[i]+"\t");
}
}
}