折半查找的前提是,数列需要是有序的。
有这么一个数组:【10, 11, 100, 200, 232, 245, 246, 400】
需要进行查找 10 这个元素
一般查找过程如下:
【10, 11, 100, 200, 232, 245, 246, 400】
| | |
开始 中间 最后
查找过程如下
1,计算整个数组的长度的中间值,例如本数组有8个元素,那么就可以从第4或者第5个元素开始查找。
2,比较该元素以后发现,232是大于10的。因此,需要从232的左边再取中间值。
3,这时发现100比10还大,然后再次去100的左边的中间值
4,这时发现11比10还大,然后继续取左边
5,比较成功结束
通过折半查找的特点可以得到这么一张查找次数和查找位置相关的表
元素值
|
数组中位置 | 查找次数 |
10
|
0
|
4
|
11
|
1
|
3
|
100
|
2
|
2
|
200
|
3
|
3
|
232
|
4
|
1
|
245
|
5
|
3
|
246
|
6
|
2
|
400
|
7
|
3
|
如果转换成二叉树的话,就会是这样的。
这个数的名字叫做判定树!
刚好做要到10这个节点时,需要经历4个点(包括他自身)。
而这个数的深度刚好是为4,因此需要做折半查找的最坏情况的次数刚好和数的深度一样。
注意:上面这个判定树的中序遍历刚好是:
【10, 11, 100, 200, 232, 245, 245, 400】