【专插本-数据结构】折半插入排序

折半插入排序

我们都知道,直接插入排序,每次都需要和已经排好序的子序列中的值比较一次,这是比较浪费时间的查找插入位置的方法,我们可以结合二分查找法来找到插入位置,这就是折半插入排序

算法思想

  • 和直接插入算法一样,每次将无序子序列中的元素插入到有序子序列中
  • 和直接插入算法不同的是,插入位置不再是依次比较,而是通过更有效率的二分查找法来寻找插入位置
  • 找到位置后,将元素往后移动,放入待插值

算法实现

/**
 * 折半插入排序
 */
void bInsertSort(int arr[],int n)
{
    for (int i = 1; i <= n;i++)
    {
        int temp = arr[i];
        int low = 0;
        int high = i - 1;
        while(low <= high)
        {
            int mid = (low + high) / 2;
            if(arr[mid] > temp)
                high = mid - 1;
            else
                low = mid + 1;
        }
        for (int j = i - 1; j >= high + 1;j--)
            arr[j + 1] = arr[j];
        arr[high + 1] = temp;
    }
}

算法评价

  • 时间复杂度:折半插入排序只是减少了元素的比较次数,其他的和直接插入排序还是一样的,所以时间复杂度还是O(n^2)
  • 空间复杂度:和直接插入排序一样,为O(1)
  • 稳定性:稳定算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值