二分查找
Posted gland
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找相关的知识,希望对你有一定的参考价值。
二分查找
概念:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求
线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
算法复杂度:
二分查找法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况
下用O(log n)完成搜索任务。
基本思想:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成
功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子
表不存在为止,此时查找不成功。
实现:
二分查找的实现方法太多,这是由不同的需求所决定的。下面列出最为简单的两种,其余几种皆可类推。
1:被查找有序序列中只有一个值与目标元素相等。
int bisearch(int array[], int low, int high, int target) { while (low <= high) { int mid = low + (high - low) / 2; if (array[mid] < target) low = mid + 1; else if (array[mid] > target) high = mid - 1; else return mid; } return low; }
2:被查找有序序列中有多个值与目标元素相等。
int bisearch(int array[], int low, int high, int target) { while (low <= high) { int mid = low + (high - low) / 2; if (array[mid] < target) low = mid + 1; else high = mid - 1; } return low; }
注意:
关于中位数,mid = low + (high - low) / 2 = (2 * low + high - low) / 2 = (low + high) / 2。就算式来说,
两式相等,但是由于后者有溢出风险,前者最为保险。循环的结束条件为 low > high,这个不用多说。
满足结束条件后,返回low,其实二分查找的整个过程都在维护low,只有中位数小于目标元素时low
才前进,不会后退,逐渐逼近目标数,low就是目标数该插入的位置。
以上是关于二分查找的主要内容,如果未能解决你的问题,请参考以下文章