折半查詢和遞迴折半查詢詳解(二分法查詢,遞迴二分法查詢)
阿新 • • 發佈:2018-12-31
演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。(前提)
主要思想是:(設查詢的陣列區間為array[low, high])
(1)確定該區間的中間位置K
(2)將查詢的值T與array[k]比較。
若相等,查詢成功返回此位置k;
否則確定新的查詢區域,繼續二分查詢。
區域確定如下:
a.array[k]>T 由陣列的有序性可知array[k,k+1,……,high]>T;故新的區間為array[low,……,K-1]
b.array[k]<T 類似上面查詢區間為array[k+1,……,high]。
每一次查詢與中間值比較,可以確定是否查詢成功,不成功當前查詢區間縮小一半。
遞迴找,即可,時間複雜度:O(log2n)。
(A). 非遞迴方法的C++程式描述如下:
int BinarySearch(int *p,const int x,const int n) { int left=0,right=n-1; while(left<=right) { int middle=(left+right)/2; if(x<p[middle]) { right=middle-1; } else if(x>p[middle]) { left=middle+1; } else { return middle; } } return -1; }
完整的C++程式如下:
執行截圖:#include<iostream> using namespace std; int BinarySearch(int *p,const int x,const int n) { int left=0,right=n-1; while(left<=right) { int middle=(left+right)/2; if(x<p[middle]) { right=middle-1; } else if(x>p[middle]) { left=middle+1; } else { return middle; } } return -1; } int main() { int a[5]={1,2,3,4,5}; int y=5; int ret=BinarySearch(a,y,5); if(-1==ret) { cout<<y<<" 不存在!"<<endl; } else { cout<<y<<"的下標是: "<<ret<<endl; } return 0; }
(B). 遞迴二分法查詢C++程式描述如下:
<span style="color:#333333;">int BinarySearch(int *p,const int x,const int left,const int right)
{
if(left<=right)
{
int middle=(left+right)/2;
if(x<p[middle])
{
return BinarySearch(p,x,left,middle-1);
}
else if(x>p[middle])
{
return BinarySearch(p,x,middle+1,right);
}
return middle;
}
return -1; //沒找到
}</span>
完整的C++程式如下:
#include<iostream>
using namespace std;
int BinarySearch(int *p,const int x,const int left,const int right)
{
if(left<=right)
{
int middle=(left+right)/2;
if(x<p[middle])
{
return BinarySearch(p,x,left,middle-1);
}
else if(x>p[middle])
{
return BinarySearch(p,x,middle+1,right);
}
return middle;
}
return -1; //沒找到
}
int main()
{
int a[5]={1,2,3,4,5};
int y=2;
int ret=BinarySearch(a,y,0,4);
if(-1==ret)
{
cout<<y<<" 不存在!"<<endl;
}
else
{
cout<<y<<"的下標是: "<<ret<<endl;
}
return 0;
}
執行截圖如下: