本文是关于二分查找及其在 C++ 中的实现。
什么是二分搜索?
“二进制”这个词实际上是指“二”。所以,可以预见的是,会有一些与“二”相关的东西。在线性搜索的情况下,我们从数组的开头开始并逐渐检查。
现在,可能存在搜索元素属于数组末尾部分的情况,我们一直在浪费时间检查所有其他元素以防线性搜索。对于任何搜索算法来说,最重要的是它的时间复杂度。尽管复杂度为 O(n) 的线性搜索似乎做得很好,但实际上并非如此。想想任何大型数据集,它需要多少时间,尽管它是 O(n)。我们负担不起这样的。这是时间复杂度要低得多的二分搜索。
二分查找是基于排序的思想。为了操作二分查找,输入数组需要排序。所以,这个想法是,我们可以从中间元素开始。如果搜索元素小于中间元素,则不需要检查中间元素右半边的元素,即,我们可以跳过大于中间元素的元素。由于数组已排序,因此可以保证右侧没有元素可以作为搜索元素。
另一方面,如果搜索元素大于中间元素,则不需要检查中间元素左半边的元素,即可以跳过小于中间元素的元素。由于数组已排序,因此可以保证左侧的任何元素都不能成为搜索元素。
二分搜索算法
考虑到 0 索引,
- Initialize a variable left=0
- Initialize a variable right=array size – 1
- While left <= right
Do
Calculate mid= (left + right)/2
If array[mid]==searching element
Return True
Else If array[mid] < searching element
Set left=mid +1
Else //array[mid] > searching element
Set right=mid –1
END While - Return False
时间复杂度
O(logn)
对于二分查找,递归关系是;
T(n)=T(n/2)+ O(1)
(因为我们总是只搜索一半)
求解递归关系,我们发现时间复杂度为 O(logn)
示例说明
设输入数组为:
1, 2, 3, 4, 5, 6
设搜索元素为:2
所以,
Left=0
Right=5(数组大小=6)
迭代1
Left<right
Mid=(0+5) /2 = 2
Array[mid]>2
So, left=0
Right=mid-1=1
迭代 2
Left<right
Mid=(0+1)/2 = 0
Array[mid]<2
So, left=mid+ 1=1
Right=1
迭代 3
Left=right
Mid=(1+1)/2 = 1
Array[mid]==2
Return True
找到的搜索元素
二分查找C++实现<
迭代解决方案
#include <bits/stdc++.h> using namespace std; int binarySearch(vector<int> a,int n, int x){ int left=0; //initialize left int right=n-1; //initialize right int mid; while(left<=right){ mid=(left+right)/2; //calculate mid if(a[mid]==x) //if the a[mid] is x value is found return 1; else if(a[mid]<x){ //if a[mid] is less than x, we need to search only the right half left=mid+1; } else //if a[mid] is less than x, we need to search only the left half right=mid-1; } //if not returned from the loop, it ensures value is not present return -1; } int main(){ int n,item,x; cout<<"Enter number of elements in the array\n"; cin>>n; vector<int> a; //input the array cout<<"Enter the elements of your array\n"; for(int j=0;j<n;j++){ scanf("%d",&item); a.push_back(item); } cout<<"Enter the value you want to search\n"; cin>>x; int result=binarySearch(a,n,x); //function to output search result if(result!=-1) cout<<x<<" is present in the array"<<endl; else cout<<x<<" is not present in the array"<<endl; return 0; }
输出:
Enter number of elements in the array 6 Enter the elements of your array 4 6 8 9 10 11 Enter the value you want to search 11 11 is present in the array
递归解决方案
#include <bits/stdc++.h> using namespace std; int binarySearch(vector<int> a,int left,int right, int x){ if(left>right) return -1; int mid=(left+right)/2; if(a[mid]==x) return 1; else if(a[mid]<x) return binarySearch(a,mid+1,right,x);//search in the right half else return binarySearch(a,left,mid-1,x);//search in the left half } int main(){ int n,item,x; cout<<"Enter number of elements in the array\n"; cin>>n; vector<int> a; //input the array cout<<"Enter the elements of your array\n"; for(int j=0;j<n;j++){ scanf("%d",&item); a.push_back(item); } cout<<"Enter the value you want to search\n"; cin>>x; int result=binarySearch(a,0,n-1,x); //function to output search result if(result!=-1) cout<<x<<" is present in the array"<<endl; else cout<<x<<" is not present in the array"<<endl; return 0; }
输出:
Enter number of elements in the array 3 Enter the elements of your array 4 7 9 Enter the value you want to search 6 6 is not present in the array
这就是 C++ 中的二分搜索