折半插入排序比较次数时间复杂度

折半插入排序比较次数时间复杂度

折半插入排序 — 插入第N个数时比较次数时间复杂度O(nlog2(n)):

根据算法思想有以下的推论:

每个数插入最多走了一个判定树的深度
即log2(n-1)(取最少正整数)+1

解析:在有序数组中插入的数每次比较都是与Mid(Mid指向待比较数组中的中间位置)所指向的数进行对比,先将有序数组转化成类似判定树的二叉树形式,可以得出比较的次数最多只能是这一棵二叉树的深度。

示例:

假设一组有序数组:1 2 3 4 5 6 7 8 9 (注意已经选过的Mid不再重选)

第一次Mid:
low=1,high=9,所以Mid=(low+high)/2=5
        建立二叉树的根
             ⑤
第二次Mid:5的左边low=1 high=4 Mid=(low+high)/2=25的右边low=6 high=9 Mid=(low+high)/2=7
         继续扩展二叉树
             ⑤
          ②     ⑦
第三次Mid:2的左边low=1 high=1 Mid=(low+high)/2=12的右边low=3 high=4 Mid=(low+high)/2=37的左边low=6 high=6 Mid=(low+high)/2=67的右边low=8 high=9 Mid=(low+high)/2=8
         继续扩展二叉树
             ⑤
        ②         ⑦
    ①     ③    ⑥      ⑧
第四次Mid:3的右边low=4 high=4 Mid=(low+high)/2=48的右边low=9 high=9 Mid=(low+high)/2=9
        继续扩展二叉树
            ⑤
     ②            ⑦
  ①     ③      ⑥     ⑧
          ④            ⑨

一直到有序数组的全部元素都有这时候就转化完成
(任何的有序数组都能用这一方法转化为二叉树)

当插入一个10时:(直到没有数和它比较时候就比较完毕,小左大右)
         ⑤        (先与5进行第一次比较,大于55的右边比较)
    ②        ⑦    (与7进行第二次比较,大于77的右边比较)
  ①   ③    ⑥   ⑧  (与8进行第三次比较,大于88的右边较)
       ④        ⑨(与9进行第四次比较,大于99的右边较,9没有右孩子不用再比较,比较完毕)

比较次数为4次 
根据公式可得log2(10-1)(取最少正整数)+1=3+1=4

可以看出,在插入第N个数进入一个有序的数组时,这时有序数组已经存在了N-1个数,并且比较的次数最多也只能是由有序数组已经存在的N-1个数所转化成的二叉树深度。
即log2(N-1)(取最少正整数)+1

具有n个结点的完全二叉树的深度为「log2n」+1

所以比较次数N<=log2(n-1)(取最少正整数)+1
      n-1
令i=n,=log2(1)+1+log2(2)+1+....+log2(n-1)+1
      i=1
=log2[(n-1)]+n
当n很大时log2[(n-1)]≈log2(n!)
在计算机内为了方便计算log2(n!)≈n*log2(n)
log2(n!)与n*log2(n)同为一个数量级

可得比较次数的总时间复杂度为O(nlog2(n))


第一次写文章,未必正确,如有错误请指出,小弟一定更改。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值