排序 - 直接插入排序

前面,我们提到了,冒泡排序非标准版,标准版,优化版,和选择排序,下面我们来说下直接插入排序


直接插入排序的作法是:


每次从无序表中取出第一个元素,把它插入到有序表的合适位置,是有序表仍然有序。


第一趟比较前两个数,然后把第二个数按大小插入到有序表中;


第二趟把第三个数据与前两个数从后往前扫描,把第三个数按大小插入到有序表中;


依次进行下去,进行了(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");
               }
        }
}
 

猜你喜欢

转载自alan-hjkl.iteye.com/blog/1583025