二分搜索算法


介紹

在計算機科學中,二分搜索(英語: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;
}

相關題目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM