折半插入排序比较次数时间复杂度
折半插入排序 — 插入第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=2
在5的右边low=6 high=9 Mid=(low+high)/2=7
继续扩展二叉树
⑤
② ⑦
第三次Mid:
在2的左边low=1 high=1 Mid=(low+high)/2=1
在2的右边low=3 high=4 Mid=(low+high)/2=3
在7的左边low=6 high=6 Mid=(low+high)/2=6
在7的右边low=8 high=9 Mid=(low+high)/2=8
继续扩展二叉树
⑤
② ⑦
① ③ ⑥ ⑧
第四次Mid:
在3的右边low=4 high=4 Mid=(low+high)/2=4
在8的右边low=9 high=9 Mid=(low+high)/2=9
继续扩展二叉树
⑤
② ⑦
① ③ ⑥ ⑧
④ ⑨
一直到有序数组的全部元素都有这时候就转化完成
(任何的有序数组都能用这一方法转化为二叉树)
当插入一个10时:(直到没有数和它比较时候就比较完毕,小左大右)
⑤ (先与5进行第一次比较,大于5再5的右边比较)
② ⑦ (与7进行第二次比较,大于7再7的右边比较)
① ③ ⑥ ⑧ (与8进行第三次比较,大于8再8的右边较)
④ ⑨(与9进行第四次比较,大于9再9的右边较,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))
第一次写文章,未必正确,如有错误请指出,小弟一定更改。