折半插入排序

思路:从数组第二个元素开始折半插入,即把第一个元素看成有序的,然后下标后移一位,直到数组最后一个元素折半插入成功,注意:数组第0号元素不存值,用来存储每次要插入的数据

步骤:1.判断要插入的元素是否处于有序状态,是则继续,否则下标后移

        2.利用折半查找要插入的下标,记为t

       3.从t开始所有数据后移一位,插入已经标记在a[0]的元素


//length为数组长度(0号下标不存值,不计算在长度中)
void insert(int *a,int length)
{
    for(int i=2;i<=length;i++)//从第二个元素到最后一个元素依次插入
    {
        if(a[i]<a[i-1])//判断要插入的元素是否小于前一个元素,是则无序,否则有序,无需插入
        {
            //折半查找要插入位置的下标
            int low=1,high=i-1;
            a[0]=a[i];//a[0]用来标记元素
            //折半查找要插入的下标位置
            while (low<=high)
            {
                int mid=(low+high)/2;
                if(a[mid]<a[0])
                    low=mid+1;
                else
                    high=mid-1;
            }
            //循环结束,low为要插入的下标,使low之后的元素统一向后移一位
            for(int j=i-1;j>=low;j--)
                a[j+1]=a[j];
            a[low]=a[0];//插入已经标记的元素
        }
    }
}
原文地址:https://www.cnblogs.com/runninglzw/p/3768626.html