目錄
介紹
在計算機科學中,二分搜索(英語:binary search),也稱折半搜索(英語:half-interval search)、對數搜索(英語:logarithmic search),是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。
時間復雜度和空間復雜度
時間復雜度
二分搜索在最壞情況下的復雜度是對數時間,進行O(logn) 次比較操作,n在此處是數組的元素數量。最好情況下O(1).
空間復雜度
如果迭代實現二分搜索則空間復雜度為O(1),如果遞歸實現空間復雜度為O(logn)。無論對任何大小的輸入數據,算法使用的空間都是一樣的。除非輸入數據數量很少,否則二分搜索比線性搜索更快,但數組必須事先被排序。盡管特定的、為了快速搜索而設計的數據結構更有效(比如哈希表),二分搜索應用面更廣。
代碼實現
最原始的模板
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int nums[5] = {1,2,3,4,5};
int target = 0;
int left = 0,right = 4;
int ans = -1;
printf("請輸入target:");
scanf("%d",&target);
while(left <= right)
{
int mid = (left+right)/2;
if(nums[mid] == target)
{
ans = mid;
break;
}
else if(nums[mid] > target)
{
left = mid+1;
}
else if(nums[mid] < target)
{
right = mid-1;
}
}
printf("%d",ans);
return 0;
}

注意:結束條件是left <= right
查找第一個與key相等的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0,right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] >= target) right = mid-1;
else left = mid+1;
}
if(left >= 0 && left < nums.size() && nums[left] == target) ret.push_back(left);
return -1;
}
查找最后一個與key相等的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0;right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] <= target) left = mid+1;
else right = mid-1;
}
if(right >= 0 && right < nums.size() && nums[right] == target) ret.push_back(right);
return -1;
}
查找最后一個等於或者小於key的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0;right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] > target) right = mid-1;
else left = mid+1;
}
return right;
}
查找最后一個小於key的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0;right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] >= target) right = mid-1;
else left = mid+1;
}
return right;
}
查找第一個等於或者大於key的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0;right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] >= target) right = mid-1;
else left = mid+1;
}
return left;
}
查找第一個大於key的元素
int binarySearch(vector<int>& nums,int target)
{
int left = 0;right = nums.size()-1;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] > target) right = mid-1;
else left = mid+1;
}
return left;
}
