常见排序算法-折半(二分)插入排序

其实是主要在二分查找算法的基础上执行插入操作

接下来我结合算法的实际例子来解释

初始数组 10 21 7 13 14 3 12 ,对其进行由小到大进行排序

/先解释一下2分法,比如在一个有序数组{1,2,3,3,6,9,11}中,我要查找数字2在其中的位子,首先先比较2与数组中间数字3的大小,发现2小于3,则2肯定在数字3的左边数组{1.2.3},比较2与{1.2.3}的中间数2,发现相等,输出该个位置即可。/

第一步,看数组第一个数10,利用2分法找到10在集合{}的插入位置,进行插入操作后集合变成{10},/注意,这一步可做可不做。/接下来利用2分法找到下一个数21在集合{10}的插入位置,进行插入操作后集合变成{10,21},接下来利用2分法找到下一个数7在集合{10,21}的插入位置,进行插入操作后集合变成{7,10,21}…….按照此规则直到所有结点插入完成后即可结束,最后排序为{3,7,10,12,13,14,21}.

//先利用二分寻找法找到这个数应该插
//入的位置,然后对这个位置后面的数组均向后移一位。
//接下来对下一个数执行下一个这样的操作,直到所有的结点遍历完成。
void twoins(int a[],int n)//功能:遍历所有结点
{
    int i,d,term;
    for(i=1;i<n;i++)
    {
        term=a[i];
        d=search(a,0,i-1,term);//返回该点插入的位置.
        pai(a,i,d,term);
    }
}
int search(int a[],int low,int high,int th)//寻找结点在前面序列中应该插入的位置
{
    if(low<=high)//当不满足该条件时,返回low(应该插入的)的值
    {
        int mid=(low+high)/2;
        if(term>=a[mid])
            return search(a,mid+1,high,term);
        if(term<a[mid])
            return search(a,low,mid-1,term);
    }
    return low;
}
void pai(int a[],int n,int d,int th)//将点插入该数后后面的点都要向后移一位
{
    int i;
    for(i=n;i>d,i--)
    {
        a[i]=a[i-1];
    }
    a[i]=th;
}

猜你喜欢

转载自blog.csdn.net/weixin_42373888/article/details/81781951
今日推荐