折半查找是一種比較高效的查找方式,其基本思想是:在某個有序表中,取出中間的記錄作為比較對象,如果要查找記錄的關鍵碼等於中間記錄的關鍵碼,則查找成功;若要查找記錄的關鍵碼小於中間記錄的關鍵碼,則在中間記錄的左半區繼續查找;若查找記錄的關鍵碼大於中間記錄的關鍵碼,則在中間記錄的右半區繼續查找。不斷重復上述查找過程,直到查找成功,或有序表沒有所要查找的記錄,查找失敗。實現過程有兩種方式遞歸法和非遞歸法。
1.非遞歸法:查找成功則返回位置,查找失敗則范圍-1.
/////////////////////////////////////////////////
//非遞歸查找1. numVec為待查找的集合2.x為待查找數值 3.beg為查找范圍起始 4.last為查找范圍結束
/////////////////////////////////////////////////
int Bisearch::BiSearch(vector<int> numVec,int x,int beg,int last){
int mid;//中間位置
if(beg>last){ //beg開始位置大於last結束位置,目前只考慮升序狀態下
return -1;
}
while(beg<=last){
mid =(beg+last)/2;
if(x==numVec[mid]){//x(關鍵碼)剛好跟中間值(numVec[mid])相同
return mid;
}else if(x>numVec[mid]){//x(關鍵碼)大於中間值(numVec[mid]),起點定位到mid+1
beg = mid +1;
}else if(x<numVec[mid]){//x(關鍵碼)小於於中間值(numVec[mid]),終點定位到mid-1
last = mid -1;
}
}
return -1;
}
2.遞歸法:
int Bisearch::IterBiSearch(vector<int> numVec,int x,int beg,int last){
//中間位置初始化為-1
int mid =-1;
mid = (beg+ last)/2;
if(x==numVec[mid]){
return mid;
}else if(x<numVec[mid]){
return IterBiSearch(numVec,x,beg,mid-1);
}else if(x>numVec[mid]){
return IterBiSearch(numVec,x,mid+1,last);
}
return -1;
}