您的位置:首页 > 其它

二分查找之应用篇

2013-05-21 16:52 190 查看
二分查找,又称折半查找。假设数组长度为N,则算法复杂度为O(log(n));

其优点是:比较次数少,查找速度快,平均性能好。

其缺点是:要求待查表为有序表,而且插入删除困难。

算法要求:必须采用顺序存储结构且关键字大小有序(升序、降序都可)。

算法原理:查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止.

int search4(int array[], int n, int v)
{
int left, right, middle;

left = -1, right = n;

while (left + 1 != right)
{
middle = left + (right - left) / 2;

if (array[middle] < v)
{
left = middle;
}
else
{
right = middle;
}
}

if (right >= n || array[right] != v)
{
right = -1;
}

return right;
}

一下是百度面试的一道题,其中可以应用到二分查找的思想。

题目:有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4,
6, 77,200} ,绝对值最小的是-4。

算法实现的基本思路:
找到负数和正数的分界点,如果正好是0就是它了,如果是正数,再和左面相邻的负数绝对值比较,如果是负数,取取绝对值与右面正数比较。还要考虑数组只有正数或负数的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: