zoukankan      html  css  js  c++  java
  • 插入排序

    下面我们来讲一下插入排序

    基本思想如下:

    将一个记录插入到已排序好的有序表中,从而得到一个新的有序表。实现要点,我们需要设立一个哨兵,作为临时存储和判断数组边界来用。直接插入的代码如下:

     1  for(i=1;i<n;i++)
     2     {
     3         //如果第i个元素大于第i-1元素,直接插入
     4         //否则,移动有序表后再插入
     5         if(a[i]<a[i-1])
     6         {
     7             j=i-1;
     8             x=a[i];//复制为哨兵
     9             a[i]=a[i-1];//先后移一个元素
    10             while(x<a[j])//查找要插入的位置
    11             {
    12                 a[j+1]=a[j];//元素后移
    13                 j--;
    14             }
    15             a[j+1]=x;//插入到正确位置
    16         }
    17     }

    直接插入算法的时间复杂度为O(n^2)。

    改进算法可以用折半插入排序。因为插入排序要求对已经有序的表进行插入,我们可以用折半查找法来查找要插入的位置。代码如下:

     1  for(i=1;i<n;i++)
     2    {
     3     int temp=a[i];
     4     int low=0 5     int high=i-1;
     6     while(low<=high)//查找要插入的位置
     7     {
     8         int mid=(low+high)/2;
     9         if(temp<a[mid])//在左(低)半区找
    10             high=mid-1;
    11         else//在右(高)半区找
    12             low=mid+1;
    13     }
    14     for(j=i;j>=low;j--)
    15     {
    16         a[j]=a[j-1];//元素后移
    17     }
    18     a[low]=temp;//插入
    19    }
  • 相关阅读:
    docker 第六篇 dockerfile
    docker 第五篇 存储
    8.4总结
    消失之物,分治
    NOIP模拟9
    卡特兰数总结
    【洛谷】P3537 [POI2012]SZA-Cloakroom
    0915 N校联考
    [树链剖分]BZOJ3589动态树
    0905膜你赛测试
  • 原文地址:https://www.cnblogs.com/sdutmyj/p/4545577.html
Copyright © 2011-2022 走看看