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

本文介绍了一种基于二分查找的插入排序算法实现方法。通过使用二分查找确定待插入元素的位置,以此优化传统插入排序的效率。文章通过具体实例详细展示了算法的工作流程。
其实是主要在二分查找算法的基础上执行插入操作
接下来我结合算法的实际例子来解释
初始数组 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值