概述
二分查找又称折半查找。
优点:比较次数少,查找速度快,平均性能好;
缺点:要求待查表为有序表,且插入删除困难。
折半查找方法适用于不经常变动而查找频繁的有序列表。
1、首先,假设表中元素是按升序排列
2、将表中间位置记录的关键字与查找关键字比较
3、如果两者相等,则查找成功;
4、否则利用中间位置记录将表分成前、后两个子表,
5、如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
6、重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
时间复杂度就是while循环的次数 O(logn)
#include <iostream>
using namespace std;
//low和high是指的是对应的数组的下标 。
int BinSearch(int array[],int low,int high,int target)
{
while(low <= high)
{
/*使用(low+high)/2会有整数溢出的问题。
问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
这样,产生溢出后再/2是不会产生正确结果的。
而low+((high-low)/2)不存在这个问题*/
int mid =low +(high - low)/2;
if(array[mid] > target)
{
high = mid - 1;
}
else if(array[mid] < target)
{
low = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int a[]={1,2,3,4,5};
int result = BinSearch(a,0,4,1);
cout << result << endl;
}
递归算法:
#include <iostream>
using namespace std;
int k;
int found(int a[],int x,int y)
{
int mid = x + (y - x)/2;
//递归结束的条件
if(x > y)
{
return -1;
}
else
{
if(a[mid] == k)
{
return mid;
}
else if(a[mid] > k)
{
return found(a, x , mid - 1);
}
else
{
return found(a, mid + 1,y);
}
}
}
int main()
{
int a[]={1,2,3,5,7,8,9,10,34,45};
while(cin >> k)
{
cout << found(a,0,9) << endl;
}
return 0;
}
递归的另一种方式:
int found(int a[],int start,int end)
{
int mid = start+ (end- start)/2;
//递归结束的条件
if(start> end)
{
return -1;
}
else
{
if(a[mid] == k)
{
return mid;
}
else if(a[mid] > k)
{
end = mid - 1;
}
else
{
start = mid + 1;
}
return found(a,start,end);
}
}
最后
以上就是苹果皮卡丘为你收集整理的二分查找算法(折半查找算法)的全部内容,希望文章能够帮你解决二分查找算法(折半查找算法)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复