二分查找

来源:互联网 发布:淘宝店铺投诉怎么投诉 编辑:程序博客网 时间:2024/05/21 17:35

二分查找算法:是一种在有序数组中查找某一特定元素的搜索算法。

二分查找思想:搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。

二分查找算法要求:1>必须采用顺序存储结构;2>必须按关键字大小有序排列。

其流程图如下:(来自于百度百科)


算法实现

#include <iostream>using namespace std;//二分查找: 递归实现int binarySearch(int a[],int low,int high,int key){int mid=low+(high-low)/2;if(low>high)return -1;else{if(a[mid]==key)return mid;else if(a[mid]>key)return binarySearch(a,low,mid-1,key);elsereturn binarySearch(a,mid+1,high,key);}}//二分查找:非递归方法实现int binarySearch(int a[],int n,int key){int low=0,high=n-1;int mid;while(low<=high){mid=(low+high)/2;if(key==a[mid])return mid;else if(key<a[mid])high=mid-1;elselow=mid+1;}return -1;}int main(){int a[8]={1,3,4,5,6,7,9,10};int index=0;//index=binarySerach(a,0,8,3);index=binarySearch(a,8,3);cout<<"下表索引:"<<index<<endl<<"输出要查找的值:"<<a[index]<<endl;return 0;}
输出结果



二分查找应用

二分查找法找寻边界值

二分查找法统计元素出现的个数

leetcode:数组之Search in Rotated Sorted Array

二分查找的优点:二分查找法的O(log n)让它成为十分高效的算法,是比较次数少,查找速度快,平均性能好

二分查找法的缺陷:

数组必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组

数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。

解决这些缺陷问题更好的方法:使用二叉查找树,最好自然是自平衡二叉查找树了,自能高效的(O(n log n))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。


0 0